2012-03-19 3 views
2

У меня есть следующая процедура:Oracle удаления из вложенной таблицы

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% уверен, что команда для ехеса ute является правильным. И ORACLE 10G создает процедуру штрафа, поэтому, пожалуйста, вы можете предоставить помощь, которую я могу решить эту проблему.

Спасибо так много

+0

Я думаю, 'LINE 8': DELETE TABLE (SELECT Q FROM AQ) AQT WHERE AQT.Year = NULL;'. И подзапрос «однострочный» должен быть '(SELECT Q FROM AQ)'. Ну, хотя я не эксперт в Oracle, но из того, что я знаю о SQL, я вполне могу поверить, что такой запрос * может * возвращать более одной строки. Может быть, вы должны переместить условие «YEAR = NULL» в подзапрос (и, возможно, сделать его более конкретным)? –

+0

С другой стороны, почему этот вопрос помечен 'mysql'? –

+2

Даже если это, вероятно, не проблема, 'AQT.Year = NULL' должен быть' AQT.Year is NULL' –

ответ

5

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

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

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

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

+0

Спасибо, что он сработал – user1137472