2011-02-23 48 views
1

我有這個疑問DBMS_SQL.Execute和批量更新 - 需要幫助

選擇COL1,COL2從表其中 性判據=:criteria_var

DBMS_SQL中正在使用的特定查詢打開光標和BIND的變量。這些值然後由DBMS_SQL函數獲取,然後DBMS_SQL函數更新另一個表。但這種情況一次只發生一次。

我想使用BULK FETCH INTO。我已經閱讀了教程,但是我找不到任何可以在DBMS_SQL中使用BULK FETCH INTO的地方。

是否有可能?如果是的話,那麼如何?

回答

1

您可以使用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) 
+0

單個更新語句?你是什​​麼意思。我是Pl/SQL的noob .. – 2011-02-23 22:17:13

+1

@alee - 好的。然後讓我退後一步。爲什麼你需要使用動態SQL(和DBMS_SQL包)?例如,您是否在編譯時不知道表名? – 2011-02-23 22:19:07

+0

我知道從哪裏獲取數據的表。給定的列值將通過** dblink **在另一個表中更新。你寫的最後一個代碼(單個更新語句)不會很慢嗎?相比批量更新或什麼? – 2011-02-24 15:22:55