我是甲骨文的新手,所以如果在其他地方有所涉及,请与我联系。
我有一个运行作业的MS SQL框,调用运行SQLPLUS到ETL的脚本的批处理文件到Oracle 10G数据库。
我有一个间歇性的问题,脚本导致ETL失败,在没有错误记录的情况下,这是一个未知的事情。当前的解决方案突出显示了在脚本完成之前和之后基于行计数的加载失败。
我希望能够将运行违规脚本时遇到的任何错误插入到接收数据加载的同一数据库的错误日志表中。
脚本没有太多技术性,在高级别上通过SQL代码执行以下步骤并且没有程序调用。
请告知是否可以通过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;
所以继续其他步骤。
任何助理都将不胜感激。
答案 0 :(得分:0)
虽然没有完全理解你的要求,但还有几点。
WHERVER SQLERROR EXIT FAILURE ROLLBACK WHERVER OSERROR EXIT FAILURE ROLLBACK
INSERT ...
INSERT ...
如果以下任何语句失败,这将导致sqlplus以错误状态1退出。
您还可以拥有WHENEVER SQLERROR CONTINUE ...
由于WHENEVER ... EXIT FAILURE / SUCCESS控制退出状态,调用脚本/程序将知道它是否有效。
使用SPOOL将out假脱机到文件。
最好的方法是将您的语句包装到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