2017-07-03 34 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 ...它的工作。 –