我有以下程序:
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创建的程序很好,所以请您提供帮助,我可以解决这个问题。
非常感谢你
答案 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
。