2

我对 Oracle 很陌生,所以如果这在其他地方有所涉及,请与我联系。

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

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

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

脚本没有什么太技术性的东西,在高层次上是通过 SQL 代码执行以下步骤,没有过程调用。

  1. 使用日期和当前行数更新表
  2. 将数据从远程源提取到临时表中
  3. 将暂存表合并到中间暂存表中
  4. 执行一些转型行动
  5. 将中间临时表合并到最终的 Fact 表中
  6. 使用新的行数更新表

请告知是否可以通过 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;

所以它继续其余的步骤。

任何助手将不胜感激。

4

1 回答 1

0

虽然不完全了解您的要求,但有几点建议。

  1. WHENEVER 命令将帮助您控制 sqlplus 在发生错误时应该执行的操作,例如

当 SQLERROR 退出失败回滚 当 OSERROR 退出失败回滚

插入 ...

插入 ...

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

您还可以让 WHENEVER SQLERROR CONTINUE ...

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

  1. 日志记录

使用 SPOOL 将输出假脱机到文件。

  1. 记录到表。

最好的方法是将您的语句包装到 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
于 2013-11-23T15:02:57.637 回答