2014-02-13 2 views
0

Я новичок в PL/SQL, и мне было интересно, если я могу использовать результат массивного сбора, как это:Использование Bulk Collect результат в запросе на выборку без курсора

Declare 
type result_bulk_type is Table of table1.ID%type; 
result_bulk result_bulk_type; 
BEGIN 
SELECT id BULK COLLECT INTO result_bulk FROM table1; 
UPDATE table2 SET status=1 WHERE id IN result_bulk; 
END; 

я получил ошибки при компиляции:

PL/SQL: SQL заявление игнорировали

PL/SQL: ORA-00932: несовместимые типы данных: ожидаемое число получил SYS_PLSQL_22223_23_1

Спасибо за вашу помощь!

ответ

2

Нет, это невозможно сделать таким образом. Вместо этого используйте инструкцию FORALL.
Прочитайте это: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/forall_statement.htm#LNPLS01321

Пример:

Declare 
    type result_bulk_type is Table of table1.ID%type; 
    result_bulk result_bulk_type; 
BEGIN 
    SELECT id BULK COLLECT INTO result_bulk FROM table1; 
    FORALL i IN INDICES OF result_bulk 
    UPDATE table2 SET status=1 WHERE id = result_bulk(i); 
END; 
/

демо: http://sqlfiddle.com/#!4/b3a72/1

+0

ОК спасибо! Но есть ли другой способ сделать это? (без использования BULK COLLECT и FORALL) Сохранить результат в массиве? – Othman

1

Используйте 'WHERE ID ЧЛЕН result_bulk'

+0

ОК, я попробую это так, потому что на самом деле у меня есть 6 обновлений, и с помощью метода FORALL мне нужно будет создать 7 вызовов FORALL, которые, кажется, занимают много времени – Othman

Смежные вопросы