DBMS_SQL.Execute и BULK обновление - нужна помощь - PullRequest
1 голос
/ 23 февраля 2011

У меня есть этот запрос

выберите col1, col2 из таблицы, где critera =: crit_var

В DBMS_SQL используется конкретный запрос для открытия курсора и BIND переменные.Затем значения выбираются функциями DBMS_SQL, которые затем обновляют другую таблицу.но это происходит по одной строке за раз.

Я хочу использовать BULK FETCH INTO.Я прочитал учебники, но я не смог найти что-нибудь, где я могу использовать BULK FETCH INTO с DBMS_SQL.

это возможно?если да, то как?

1 Ответ

1 голос
/ 24 февраля 2011

Вы можете использовать процедуру BIND_ARRAY в пакете DBMS_SQL для выполнения массовой выборки. пример этого приведен в документации к DBMS_SQL.

Однако, если нет особой необходимости использовать DBMS_SQL (и, если предположить, что динамический SQL на самом деле необходим в первую очередь), кажется,вероятно, что было бы проще использовать собственный динамический SQL, т.е.

EXECUTE IMMEDIATE 'SELECT col1, col2 FROM tableName WHERE criteria = :1'
   BULK COLLECT INTO l_col1_collection, l_col2_collection
  USING l_criteria_variable;

Если вы просто выбираете данные из этого запроса для обновления другой таблицы, однако, было бы более эффективно простоOracle выполняет эту работу, создавая один оператор UPDATE, который использовал этот запрос для извлечения нескольких строк.Что-то вроде

UPDATE destination_table dest
   SET (col1, col2) = (SELECT col1, col2
                         FROM source_table_name src
                        WHERE criteria = l_criteria_variable 
                          AND src.key_column = dest.key_column)
 WHERE EXISTS( SELECT 1
                 FROM source_table_name src
                WHERE criteria = l_criteria_variable 
                  AND src.key_column = dest.key_column)
...