2012-03-27 19 views
1

私はPL/SQLの中で次々に実行するいくつかのSQL(Select/Update/Insert)構文を持っていますPL/SQLがSQLの実行を確認したらOKかどうかを確認しますか?

各構文が正しく完了したかどうかを確認する方法はありますか、 PL/SQL全体を停止すると、「OK」または「Not OK」が変数に返され、IFで使用できるようになります。

UPDATE

私はこの機能を思い付いたが、それはそれは0のすべての時間を返し、動作しているようではない用量!

create or replace 
FUNCTION EXECUTE_SQL(
     V_SQL IN VARCHAR2) 
    RETURN NUMBER 
    AS 
    V_RESULTS NUMBER := 1; 
    BEGIN 
    BEGIN 
     EXECUTE IMMEDIATE V_SQL; 
    EXCEPTION 
    WHEN OTHERS THEN 
     -- the following line is just for debugging! 
     dbms_output.put_line(SQLERRM); 
     V_RESULTS:= 0; 
    END; 
    RETURN V_RESULTS; 
    END EXECUTE_SQL; 

何か間違ったウィット(もしあれば)! 歓声

+1

v_sqlの関数には何を渡しますか? dbms_output.put_lineは何を出力しますか? –

+3

警告: 'それ以外の時は' RAISE'がなければ、トム・キテは泣いてしまいます。 –

+0

@Renév_sqlには、任意のSQL構文を使用できます。およびdbms_output.put_line(SQLERRM)。機能が壊れていないかどうかを確認するだけです!私はそれが機能すると、それを削除します、それだけです! –

答えて

4
if sql%rowcount > 0 then 
    -- insert or update statement affected sql%rowcount rows 
end if; 

:あなたは、あなたができる例外を発生させることができ、すべての文を実行し、1つのにもかかわらずしたい場合は

構文が間違っている場合は、それもしませんコンパイル。データ一貫性エラー(0で割るエラーや主キー違反など)がある場合、例外がスローされます。このような例外が例外ハンドラではexception handlers

にキャッチすることができ、あなたは、より多くの詳細についてはsqlerrmを確認することができます。

begin 
    update t set x = ... 
exception when others then 
    dbms_output.put_line(SQLERRM); 
end; 

は、あなたがチェックすることができるいくつかのpredefined exceptionsもあります

begin 
      update t set x = ... 
exception 
    when DUP_VAL_ON_INDEX 
     -- primary key or unique key violation 
    when OTHERS 
     -- other kind of exception 
    end; 
+0

ありがとう、私はあなたの答えに基づいて私の質問を更新した、歓迎することを願って –

+1

"もし構文が間違っていても、それはコンパイルされません" SQLは即時実行されるので、コンパイル時に。無効なsqlを関数に渡すことは完全に可能です。 –

+0

@Burhan Ali:これを書いた時点では、質問は編集されず、 'execute immediate'についての記述はなく、' syntax immediate * 'は 'execute immediate '。だから、当時の発言は完全に正しいものでした。 –

2

構文が正しくない場合、ブロック全体が無効になるため、ブロックを実行することができなくなります。正しい構文については

BEGIN 

    BEGIN 
    statement1; 
    EXCEPTION 
    when exception1 then 
     some commands or null; 
    when exception2 then 
     some commands or null; 
    END; 

    BEGIN 
    statement2; 
    EXCEPTION 
    when exception3 then 
     some commands or null; 
    when exception4 then 
     some commands or null; 
    END; 

    etc. 
END; 
+0

それは良い答えだった、物事をより簡単にするために私は何度もそれを呼び出すことができる関数を作った!私の更新された質問を見てください!歓迎 –

0

書き込みshow errors

begin 
      update t set x = ... 
exception 
    when DUP_VAL_ON_INDEX 
     -- primary key or unique key violation 
    when OTHERS 
     -- other kind of exception 
    end; 
/
show errors 

エラーがあれば表示されます。

+0

ありがとう、私の更新された質問を見てください!乾杯 –

関連する問題