2012-09-08 18 views
10

我有一個PL/SQL存儲過程,我想在其中運行幾個更新,然後捕獲任何異常並將它們返回out參數。爲了簡單起見,在下面的代碼塊中,我只是將異常代碼和錯誤消息輸出到控制檯。但是,代碼塊以下不工作(我遇到一個「發現/預期」語法錯誤)如何捕捉並返回(或打印)ORACLE PL/SQL中的異常創建或替換存儲過程

CREATE OR REPLACE PROCEDURE DBP.TESTING_SP AS 
    DECLARE 
    v_code NUMBER; 
    v_errm VARCHAR2(64); 
    BEGIN 
    UPDATE PS_NE_PHONE_TBL SET NE_PHONE_TYPE = 'TEST' WHERE NEMPLID_TBL = 'N14924'; 

    EXCEPTION 
    WHEN OTHERS THEN 
    v_code := SQLCODE; 
    v_errm := SUBSTR(SQLERRM, 1, 64); 
    DBMS_OUTPUT.PUT_LINE (v_code || ' ' || v_errm); 
    END TESTING_SP; 
    /

究竟是爲了什麼,我試圖做正確的語法?

我讀了一個論壇

「當使用創建或替換語法,你不能使用申報。聲明僅適用於未命名的匿名塊。所以,要麼刪除第1行,並創建一個匿名阻止或刪除第2行並創建一個指定的過程。「

但我不知道如何創建一個匿名塊或創建一個命名的過程來完成我想要做的事情(如果這的確是'解決方案')。有人可以幫忙嗎?

+0

除非你正在做一些有用的異常信息,否則沒有必要去捕捉它。將異常信息傳遞給調用函數的最佳方式是不做任何事情,並讓異常自然地提升。這會使用較少的代碼並保留錯誤的實際行號。 –

回答

5

只要刪除DECLARE語句即可。

+0

真棒,謝謝!你能解釋一下爲什麼我不需要這種情況下的聲明語句(我所看到的所有例子都有聲明語句)? – n00b

+2

DECLARE用於匿名塊。如果您正在創建可以按名稱調用的過程,請使用CREATE OR REPLACE PROCEDURE語法。每次要執行過程時都會運行一個匿名塊。 – DCookie