Oracle从嵌套表中删除

时间:2012-03-19 00:08:01

标签: mysql oracle oracle10g

我有以下程序:

CREATE OR REPLACE PROCEDURE My_Procedure
AS
CURSOR proced IS
SELECT aID FROM A;
BEGIN
FOR row IN proced LOOP
INSERT INTO AQ VALUES (row.aID, AQ_NT(AQT('',NULL, '', '')));
DELETE TABLE (SELECT Q FROM AQ) AQT WHERE AQT.Year=NULL;
END LOOP;
END My_Procedure;
/

程序创建正常,但我在执行它时遇到问题,我使用以下命令:

EXECUTE My_Procedure;

但我收到以下错误:

ERROR at line 1:
ORA-01427: single-row subquery returns more than one row
ORA-06512: at “SMITH. My_Procedure”, LINE 8
Ora-06512: at line 1

我已经在这几个星期了,我100%确定执行的命令是正确的。 ORACLE 10G创建的程序很好,所以请您提供帮助,我可以解决这个问题。

非常感谢你

1 个答案:

答案 0 :(得分:5)

只有输入表A包含一行时,您的程序才有效。

使用DELETE TABLE(),您尝试从嵌套表(AQ.Q)中删除某些行,但DELETE TABLE()仅在您提供一个且只有一个嵌套表(即一行)时才起作用包含一个嵌套表AQ.Q的AQ,可能包含许多嵌套行或零嵌套行)。换句话说,DELETE TABLE(blabla)仅在blabla返回单行单列结果时才有效。

在AQ中插入两行后,您的子查询(SELECT Q FROM AQ)会返回两行,并且您有一个ORA-01427错误。

旁注:在A.B.Cade的评论之后重复,AQT.Year=NULL会在SQL中产生误导性结果,因为NULL = NULL不成立。更好地使用AQT.Year IS NULL