2017-06-22 101 views
0

我想創建一個接受兩個表名作爲參數的過程,然後將一個表中的行復制到另一個表中,一次一個。我知道批量插入和SELECT INTO是更好的方法來做到這一點,但批量插入不工作,因爲當我插入多個行一次時,表觸發拋出突變錯誤。PLSQL動態定義光標

我見過其他答案,推薦使用動態SQL,但我堅持如何定義遊標的方式。

CREATE OR REPLACE PROCEDURE TABLE_INSERT(
    donor_t IN VARCHAR2, 
    empty_t IN VARCHAR2 
    ) 
AS 
    CURSOR C1 IS 
     SELECT * FROM donor_t; 
BEGIN 
    FOR row IN C1 
    LOOP 
     INSERT INTO empty_t VALUES row; 
    END LOOP; 
END; 

當編譯爲上面所寫,編譯器會引發ORA-00942: table or view does not exist.當用硬編碼表名編制,該功能用於插入如預期中的行,沒有錯誤。

+0

基本上你正在嘗試做的是插入的選擇,爲什麼不這樣做呢? 逐行處理數據對性能非常不利。 –

+0

一種選擇是查看觸發器並考慮是否可以禁用批量操作,然後重新啓用它們。很明顯,您的批量操作需要處理由觸發器執行的業務邏輯。否則,請嘗試使用Oracle文檔作爲示例 - https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/dynamic.htm#BHCGEFCA – BriteSponge

+1

@BriteSponge甚至沒有發生過我看我是否可以禁用在插入後觸發並重新啓用它們;該解決方案就像一個魅力。 – OnLinedPaper

回答

1

試試這個:

CREATE OR REPLACE PROCEDURE TABLE_INSERT(
donor_t IN VARCHAR2, 
empty_t IN VARCHAR2 
) 
AS 
    V_SQL VARCHAR2(1000); 
BEGIN 
    V_SQL := 'INSERT INTO ' || empty_t || ' SELECT * FROM ' || donor_t; 
    EXECUTE IMMEDIATE V_SQL; 
END; 
/
+0

對於動態插入語句來說,這是一個很好的解決方案,但不幸的是它仍然導致觸發器拋出突變錯誤,因爲它並非一次一個插入。 – OnLinedPaper

+0

你可以分享觸發器的代碼嗎? –