BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM CP.PM_PLANS@JXCS_CLONE';--做个链接是否的判断EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SRCS.CM_USER WHERE CREATE_DATE=232';--异常数据开始处理
EXCEPTION 
   WHEN OTHERS THEN
/*   DBMS_OUTPUT.PUT_LINE('INSERT INTO LINK_ERROR (CM_USER_REFRESH,'''||SQLERRM(SQLCODE)||''',SYSDATE)');*/
   EXECUTE IMMEDIATE 'INSERT INTO LINK_ERROR(PRO_NAME,REMARK,TIME,sql_text) VALUES (''nigth_refresh'','''||SQLERRM(SQLCODE)||''',SYSDATE,'''||substr(sqlerrm,1,200)||''')';
   COMMIT;--把错误的信息插入错误表LINK_ERROR中
End;我有这样一个错误的处理,现在主要想在我的错误表link_error中看到具体是哪个过程中的哪条语句出现了一个什么样的问题.
在LINK_ERROR这样体现
过程名               错误原因                                                      执行时间                    出错的SQL语句
 nigth_refresh ORA-00932: 数据类型不一致: 应为 DATE, 但却获得 NUMBER 2009-04-02 19:01:39 SELECT COUNT(*) FROM SRCS.CM_USER WHERE CREATE_DATE=232
现在主要是"出错的SQL语句",不知道怎么实现,如果给每条语句加变量,再来显示这个变量,就要在每条语句后面都来个EXCEPTIONS了吧.

解决方案 »

  1.   

    DECLARE 
    V_SQL VARCHAR2(1000);
    BEGIN
    V_SQL:='SELECT COUNT(*) FROM CP.PM_PLANS@JXCS_CLONE';--把每条语句赋值到V_sQL变量
    EXECUTE IMMEDIATE V_SQL;--做个链接是否的判断
    V_SQL:='SELECT COUNT(*) FROM SRCS.CM_USER WHERE CREATE_DATE=232';EXECUTE IMMEDIATE V_SQL;--异常数据开始处理
    EXCEPTION 
       WHEN OTHERS THEN
    /*   DBMS_OUTPUT.PUT_LINE('INSERT INTO LINK_ERROR (CM_USER_REFRESH,'''||SQLERRM(SQLCODE)||''',SYSDATE)');*/
       EXECUTE IMMEDIATE 'INSERT INTO LINK_ERROR(PRO_NAME,REMARK,TIME,sql_text) VALUES (''nigth_refresh'','''||SQLERRM(SQLCODE)||''',SYSDATE,'''||V_SQL||''')';
       COMMIT;--如果异常,把V_SQL中的内容插到错误表中
    End;
      

  2.   

    BEGIN
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM CP.PM_PLANS@JXCS_CLONE';--做个链接是否的判断
    sql:='SELECT COUNT(*) FROM SRCS.CM_USER WHERE CREATE_DATE=232';
    EXECUTE IMMEDIATE sql;--异常数据开始处理
    EXCEPTION 
       WHEN OTHERS THEN
    /*   DBMS_OUTPUT.PUT_LINE('INSERT INTO LINK_ERROR (CM_USER_REFRESH,'''||SQLERRM(SQLCODE)||''',SYSDATE)');*/
       EXECUTE IMMEDIATE 'INSERT INTO LINK_ERROR(PRO_NAME,REMARK,TIME,sql_text) VALUES (''nigth_refresh'','''||SQLERRM(SQLCODE)||''',SYSDATE,'''||sql||''')';
       COMMIT;--把错误的信息插入错误表LINK_ERROR中
    End;
      

  3.   

    您这样是把要执行的语句给个变量吧,这样去显示具体变量的名称,但是如果有多少变量,那不是要每个语句都来个EXCEPTIONS呢? 我就不想这样麻烦呢
      

  4.   


    SQLERRM只能返回oracle内部的错误描述,而LZ要的错误信息是按用户要求来写,好像没什么捷径
      

  5.   

    我的意思是有没有系统内置的变量来显示这个错误的SQL语句呢?
      

  6.   

    DECLARE 
    v_sql VARCHAR2(1024);
    BEGIN
    v_sql := 'SELECT COUNT(*) FROM CP.PM_PLANS@jxCS_CLONE';--做个链接是否的判断
    EXECUTE IMMEDIATE v_sql;
    v_sql := 'SELECT COUNT(*) FROM SRCS.CM_USER WHERE CREATE_DATE=232';
    EXECUTE IMMEDIATE v_sql;
    --异常数据开始处理
    EXCEPTION 
       WHEN OTHERS THEN
    /*   DBMS_OUTPUT.PUT_LINE('INSERT INTO LINK_ERROR (CM_USER_REFRESH,'''||SQLERRM(SQLCODE)||''',SYSDATE)');*/
       EXECUTE IMMEDIATE 'INSERT INTO LINK_ERROR(PRO_NAME,REMARK,TIME,sql_text) VALUES (''nigth_refresh'','''||SQLERRM(SQLCODE)||''',SYSDATE,'''||v_sql||''')';
       COMMIT;--把错误的信息插入错误表LINK_ERROR中
    End;
    /这个变量可以反复赋值的,所以哪里出错了,这个变量就是出错的语句的赋值。这时候开始EXCEPTIONS,刚好可以INSERT INTO V_SQL;