2017-06-22 72 views
0

パラメータとして2つのテーブル名を受け入れ、あるテーブルから別のテーブルに行を1つずつコピーするプロシージャを作成しようとしています。私は一括挿入を知っており、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

それは動的な挿入ステートメントのための良い解決策ですが、残念ながらトリガーが1度に1つの挿入ではないので、突然変異エラーを投げます。 – OnLinedPaper

+0

トリガーのコードを共有できますか? –

関連する問題