2012-01-12 17 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; 

當我執行這個程序的輸出是

No such record 
    PL/SQL procedure successfully complete. 

然而,根據甲骨文PDF應該拋出一個異常,我應該真正得到我在異常進入的消息。

在不存在記錄更新時發生了同樣的情況。 請指教。謝謝

回答

10

我相信SQL%NOTFOUND返回true當沒有記錄被發現。您的IF在這種情況下將評估爲true,因此請將您的put_line寫入終端。 SQL語句成功執行。如果您從命令行自行執行該SQL語句,則會收到0行更新/刪除,而不是Oracle錯誤。

如果您想拋出異常,可以在您的IF中使用RAISE,並將其指向想要引發的異常塊中的異常。

+0

謝謝我只是想確認不丟失任何東西。 – MStp 2012-01-12 20:45:03

8

沒有「異常」 - sql執行成功。它成功地刪除了每條匹配條件的記錄......這是0條記錄。同樣的事情,如果執行類似的更新語句。您使用SQL%NOTFOUND來確定沒有受到影響的記錄,但這並不意味着存在「異常」。

也許您正在考慮如果您嘗試使用「select into」子句而未找到任何匹配記錄的NO_DATA_FOUND異常。

+0

是的,我想通了一樣,但「Oracle數據庫11g開發PL/SQL程序單元VOL1」 PDF是說明應該有例外。只是想確認我不會錯過任何東西,謝謝。 – MStp 2012-01-12 20:43:22

1

這樣做,你需要使用

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

,並定義