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了吧.
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了吧.
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;
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;
SQLERRM只能返回oracle内部的错误描述,而LZ要的错误信息是按用户要求来写,好像没什么捷径
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;