如何从SQLPLus将错误记录到表中

时间:2012-11-01 16:24:20

标签: oracle10g sqlplus

我是甲骨文的新手,所以如果在其他地方有所涉及,请与我联系。

我有一个运行作业的MS SQL框,调用运行SQLPLUS到ETL的脚本的批处理文件到Oracle 10G数据库。

我有一个间歇性的问题,脚本导致ETL失败,在没有错误记录的情况下,这是一个未知的事情。当前的解决方案突出显示了在脚本完成之前和之后基于行计数的加载失败。

我希望能够将运行违规脚本时遇到的任何错误插入到接收数据加载的同一数据库的错误日志表中。

脚本没有太多技术性,在高级别上通过SQL代码执行以下步骤并且没有程序调用。

  1. 使用日期和当前行计数更新表
  2. 将数据从远程源提取到临时表
  3. 将Staging表合并到中间临时表
  4. 执行一些转型行动
  5. 将中间临时表合并到最终的Fact表
  6. 使用新行计数更新表
  7. 请告知是否可以通过SQLPLUS将错误消息,代码,行号等传递到数据库表中?如果是这样,最简单的方法就是实现这一目标。

    脚本的前几行如下所示,以提供一种风味

    /*set echo off*/
    set heading off
    set feedback off
    set sqlblanklines on
    
    /* ID 1 BATCH START TIME */
    INSERT INTO CITSDMI.CITSD_TIMETABLE_ORDERLINE TGT
    (TGT.BATCH_START_TIME)
    (SELECT SYSDATE FROM DUAL);
    COMMIT;
    
    insert into CITSDMI.CITSD_TIMETABLE_ALL_LOADS
    (LOAD_NAME, LOAD_CRITICALITY,LOAD_TYPE,BATCH_START_TIME)
    values
    ('ORDERLINE','HIGH','SMART',(SELECT SYSDATE FROM DUAL));
    commit;
    
    /* Clear the Staging Tables */
    
    TRUNCATE TABLE STAGE_SMART_ORDERLINE;
    Commit;
    
    TRUNCATE TABLE TRANSF_FACT_ORDERLINE;
    Commit;
    

    所以继续其他步骤。

    任何助理都将不胜感激。

1 个答案:

答案 0 :(得分:0)

虽然没有完全理解你的要求,但还有几点。

  1. WHENEVER命令将帮助您控制发生错误时sqlplus应执行的操作,例如
  2. WHERVER SQLERROR EXIT FAILURE ROLLBACK WHERVER OSERROR EXIT FAILURE ROLLBACK

    INSERT ...

    INSERT ...

    如果以下任何语句失败,这将导致sqlplus以错误状态1退出。

    您还可以拥有WHENEVER SQLERROR CONTINUE ...

    由于WHENEVER ... EXIT FAILURE / SUCCESS控制退出状态,调用脚本/程序将知道它是否有效。

    1. 登录
    2. 使用SPOOL将out假脱机到文件。

      1. 登录表格。
      2. 最好的方法是将您的语句包装到PLSQL匿名块中,并使用异常处理程序来记录错误。

        所以,将上面的内容放在一起,使用UNIX shell作为调用者:

        sqlplus -S /nolog <<EOF
        WHENEVER SQLERROR EXIT FAILURE ROLLBACK
        CONNECT ${USRPWD}
        SPOOL ${SPLFILE}
        
        BEGIN
           INSERT INTO the_table ( c1, c1 ) VALUES ( '${V1}', '${V2}' );
        EXCEPTION
           WHEN OTHERS THEN
              INSERT INTO the_error_tab ( name, errno, errm ) VALUES ( 'the_script', SQLCODE, SQLERRM );
              COMMIT;
        END;
        /
        
        SPOOL OFF 
        QUIT
        EOF
        
           if [ ${?} -eq 0 ]
           then
              echo "Success!"
           else
              echo "Oh dear!! See ${SPLFILE}"
           fi