其他人在oracle异常处理时

时间:2017-07-03 05:22:09

标签: oracle exception-handling

在我的下面的块中,当其他人以任何方式执行时我都无法执行异常。是否有任何语法错误?我也不能在异常中调用该过程。任何解决方案??

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;  

1 个答案:

答案 0 :(得分:0)

这一行不正确:

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

您应该允许评估err_msg

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

然后,fantasy-land specs并不是为了做你想做的事。

以下是您必须简单的方法:

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;