2017-07-03 61 views
1

在我下面的塊我不能得到執行異常當別人在任何方式。是否有任何語法錯誤?此外,我不能調用exception.Any解決方案內的程序?oracle異常處理時其他

DECLARE 
    CNT INT; 
    err_msg VARCHAR2(2000);  
BEGIN 
    SELECT av_isdbcexecuted(1, 'DDL') INTO CNT FROM DUAL; 
    IF (CNT = 0) THEN 
    BEGIN 
     DBMS_OUTPUT.PUT_LINE ('INSIDE IF...'); 
     EXECUTE IMMEDIATE 'call AV_DBCINSERT 
(1,''DDL'',''hsolanki'',''Prj1'',''Item1'',''avarne'')'; 
     EXECUTE IMMEDIATE 'CREATE TABLE AV_TEMP (col1 varchar(20))';  
    EXCEPTION 
     WHEN OTHERS THEN 
     --inside exception 
     err_msg := sqlerrm; 
     DBMS_OUTPUT.PUT_LINE ('INSIDE exception...' || err_msg); 
     EXECUTE IMMEDIATE 'call AV_DBCUPDATE (1,err_msg,''Failed'')';    
    END; 
    EXECUTE IMMEDIATE 'call AV_DBCUPDATE(1, NULL,''SUCCESS'')'; 
    END IF; 
END; 
+0

感謝編輯 –

+1

。只需將過程調用不立即執行即可。像AV_DBCINSERT(1,'DDL','hsolanki','Prj1','Item1','avarne');''AV_DBCUPDATE(1,err_msg,'Failed');''和'AV_DBCUPDATE(1,NULL ,'SUCCESS');' –

+0

感謝@KeyurPanchal –

回答

0

這條線是不正確的:

EXECUTE IMMEDIATE 'call AV_DBCUPDATE (1,err_msg,''Failed'')';  

你應該允許err_msg進行評估!

EXECUTE IMMEDIATE 'call AV_DBCUPDATE (1,'''||err_msg||''',''Failed'')';  

然後,EXECUTE IMMEDIATE的目的不是爲了做你打算做的事。

這裏是你必須着手進行簡單的辦法:我想你`不need`做`你所有的程序執行即時call`

DECLARE 
    CNT INT; 
    err_msg VARCHAR2(2000);  
BEGIN 
    SELECT av_isdbcexecuted(1, 'DDL') INTO CNT FROM DUAL; 
    IF (CNT = 0) THEN 
    BEGIN 
     DBMS_OUTPUT.PUT_LINE ('INSIDE IF...'); 
     AV_DBCINSERT (1,'DDL','hsolanki','Prj1','Item1','avarne'); 
     EXECUTE IMMEDIATE 'CREATE TABLE AV_TEMP (col1 varchar(20))';  
    EXCEPTION 
     WHEN OTHERS THEN 
     --inside exception 
     err_msg := sqlerrm; 
     DBMS_OUTPUT.PUT_LINE ('INSIDE exception...' || err_msg); 
     AV_DBCUPDATE (1,err_msg,'Failed');    
    END; 
    AV_DBCUPDATE(1, NULL,'SUCCESS')'; 
    END IF; 
END; 
+0

非常感謝@J。 Chomel ...它的工作。 –