Удаление Oracle из вложенной таблицы - PullRequest
2 голосов
/ 19 марта 2012

У меня следующая процедура:

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 Ответ

5 голосов
/ 19 марта 2012

Ваша процедура работает, только если входная таблица A содержит одну строку.

С помощью команды DELETE TABLE () вы пытаетесь удалить некоторые строки из вложенной таблицы (AQ.Q), но функция DELETE TABLE () работает.только если вы предоставляете одну и только одну вложенную таблицу (то есть одну строку AQ, которая содержит одну вложенную таблицу AQ.Q, которая, возможно, содержит много вложенных строк или ноль вложенных строк).Другими словами, DELETE TABLE (blabla) работает только в том случае, если blabla возвращает однострочный результат, состоящий из одного столбца.

Если в AQ вставлено две строки, ваш подзапрос (SELECT Q FROM AQ) возвращает две строки иу вас ошибка ORA-01427.

Примечание: повторение после комментария ABCade AQT.Year=NULL даст неверные результаты в SQL, поскольку NULL = NULL не имеет значения true.Лучше использовать AQT.Year IS NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...