您可以使用DBMS_SQL包中的BIND_ARRAY過程來執行批量提取。 DBMS_SQL文檔中有an example of this。
除非有使用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;
但是,如果您只是從此查詢中提取數據以更新其他表,那麼通過構建單個使用此查詢來獲取多行的UPDATE語句來讓Oracle執行該操作會更有效。類似於
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)
單個更新語句?你是什麼意思。我是Pl/SQL的noob .. – 2011-02-23 22:17:13
@alee - 好的。然後讓我退後一步。爲什麼你需要使用動態SQL(和DBMS_SQL包)?例如,您是否在編譯時不知道表名? – 2011-02-23 22:19:07
我知道從哪裏獲取數據的表。給定的列值將通過** dblink **在另一個表中更新。你寫的最後一個代碼(單個更新語句)不會很慢嗎?相比批量更新或什麼? – 2011-02-24 15:22:55