2017-05-18 19 views
0

TOADにレコードが存在しないことを確認した後に新しいレコードを挿入するプロシージャがあります。 それが正常に作成されます。Oracle PL/SQLプロシージャは挿入を実行しません。

CREATE OR REPLACE PROCEDURE Set_Mod ( 
    p_TypeID IN NUMBER, p_LinkID IN NUMBER 
    ) 
AS 
    v_isExists NUMBER := 0; 
    v_query varchar2(200); 
BEGIN 

    SELECT TypeID 
    INTO v_isExists 
    FROM myTable 
    WHERE LinkID = p_LinkID 
    AND TypeID = p_TypeID; 

    IF (v_isExists = 0) THEN 
     v_query := 'INSERT INTO myTable (TypeID, LinkID) VALUES (' || p_TypeID || ',' || p_LinkID || ')'; 

     EXECUTE IMMEDIATE v_query; 

    END IF; 

END; 

/

私はこのブロックを使用してプロシージャを実行しようとしています:

BEGIN 
     Set_Mod(1, 1); 

    END; 
/

私はヒキガエルにこれらのスクリプトの出力を得る:

Procedure created. 
PL/SQL procedure successfully completed. 

しかし、誰任意の挿入。それは動作しません。 問題はどこですか?

+0

レコードがすでに存在するかどうかを調べ、存在しない場合にのみ行を挿入することが目標です。何が間違っているかを修正する方法については下記の解答を読んでください。同じタイプIDのLinkID値で決して2つの行を入れることができないように、2つの列にUNIQUEキーを組み合わせたキーも考慮してください。 - 次に、重複例外をトラップし、挿入の代わりに更新を行うことができますか? – JasonInVegas

答えて

1

だからあなたのPROC内のロジックは、(一種の)音ですが、テスト・ロジックはありません:

あなたはSet_Mod(1,1)を呼び出すと、クエリが行を返す場合や、答えがv_isExists = 1のどちらかになります行が戻されない場合はPL/SQL例外NO_DATA_FOUND

この例外をトラップしないので、プロシージャは完了しますが、挿入は行われません。Set_Mod(0,0)を呼び出すと、v_isExists = 0は真ではありません。

したがって、プロシージャのPL/SQL例外の処理についてはthis documentationを、詳細はPL/SQL例外処理のSOを検索してください。

+1

私は、あなたはexecute immediateを使わず、代わりにinsertステートメントを例外ハンドラに入れ、すべてのトランザクションをそれにすることをお勧めします。 – JasonInVegas

+0

私はあなたのソリューションを使用するか、カウント(*)を選択するためにクエリを変更する必要があります。実際、この場合、重複した挿入状況には直面しません。ありがとう – Al007

関連する問題