2012-01-12 22 views
10

現在、PL/SQLを学習しており、現在はoracle HRスキーマを使用してプロシージャと例外を処理しています。存在しない行の更新/削除時のPL/SQL例外

ここに私の簡単な手順があります。

create or replace 
PROCEDURE DEL_JOB 
(p_jobid jobs.job_id%TYPE) 
AS 
sqle NUMBER; 
sqlm VARCHAR2(300); 
BEGIN 
DELETE FROM JOBS 
WHERE JOB_ID = UPPER(p_jobid); 
IF SQL%NOTFOUND THEN 
    DBMS_OUTPUT.PUT_LINE('No such record'); 
END IF; 
EXCEPTION 
WHEN OTHERS THEN 
    sqle := SQLCODE; 
    sqlm := SQLERRM; 
    DBMS_OUTPUT.PUT_LINE('There is no job with this id that could be deleted'); 
    DBMS_OUTPUT.PUT_LINE('Error Code ='||sqle||' Error message =' ||sqlm); 
END; 

私は、この手順を実行すると、出力はただし、Oracle PDFに応じて、それが例外をスローする必要がありますし、私は本当に私は例外で入力したメッセージを取得する必要があります

No such record 
    PL/SQL procedure successfully complete. 

です。

既存のレコードの更新でも同じことが起こりました。 お知らせください。ありがとう

答えて

10

SQL%NOTFOUNDは、レコードが見つからない場合はtrueと返信します。その場合、IFはtrueと評価されるため、put_lineを端末に書き込んでください。 SQL文が正常に実行されました。コマンドラインからSQL文を単独で実行すると、Oracleエラーではなく、更新/削除された行が0件になります。

例外がスローされる場合は、IFの中にRAISEを使用し、スローしたい例外ブロックの例外をポイントすることができます。

+0

ありがとうございます。私はただ何も欠けていないことを確認したかっただけです。 – MStp

8

"例外"はありません - SQLは正常に実行されました。それは、0のレコードである条件に一致するすべてのレコードを正常に削除しました。同じような更新文が実行された場合も同じことです。影響を受けたレコードが存在しないと判断するには、SQL%NOTFOUNDを使用しましたが、これは「例外」があることを意味するものではありません。

"select into"節を試しても一致するレコードが見つからない場合は、NO_DATA_FOUND Exceptionが発生している可能性があります。

+0

を定義する必要があり、そうするはい、私は同じことを考え出したが、PDFは、例外があるはず述べた「Oracle Database 11gでは、PL/SQLプログラム・ユニットVol1の開発」。ちょうど私が何かを逃していないことを確認したい、ありがとう。 – MStp

1

あなたは

IF SQL%ROWCOUNT = 0 THEN 
    RAISE no_delete; 
END IF; 

を使用し、

関連する問題