将 pl sql 异常错误写入 DBMS_OUTPUT 和 FND_FILE 作业日志

Posted

技术标签:

【中文标题】将 pl sql 异常错误写入 DBMS_OUTPUT 和 FND_FILE 作业日志【英文标题】:Writing plsql exception errors to DMBS_OUTPUT and FND_FILE job log 【发布时间】:2019-07-10 19:24:39 【问题描述】:

我有一个MERGE/UPDATE 声明。我想添加异常处理,以便如果更新因任何原因失败,写入 DBMS_output 和作业日志。我想出了一些东西 - 它编译好,但似乎不起作用。

我删除了 MAX(date) 和 group by,以便程序符合要求,但查询本身因“无法获得稳定的行集”而失败 - 但没有触发异常。

感谢任何建议。

MERGE INTO xxcb_RTL_inbnd_shipments_iface A
USING (select DISTINCT aa.shipment_line_id,aa.transaction_type,aa.last_update_date --max(aa.last_update_date) 
       from rcv_transactions aa
           right join xxcb_RTL_inbnd_shipments_iface bb on aa.shipment_line_id=bb.shipment_line_id
       where aa.transaction_type='DELIVER' 
           AND bb.interface_status='RELEASED'
       --group by aa.shipment_line_id,aa.transaction_type
) B ON (a.shipment_line_id=b.shipment_line_id)
when matched then update set a.interface_status='CLOSED'
                            ,a.interface_last_update=sysdate
                            ,a.interface_update_by='ORACLE'
where a.interface_status='RELEASED';
exception when others then FND_FILE.PUT_LINE(FND_FILE.LOG,DBMS_UTILITY.FORMAT_ERROR_STACK);           
                           FND_FILE.PUT_LINE(FND_FILE.LOG,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
                           DBMS_OUTPUT.PUT(DBMS_UTILITY.FORMAT_ERROR_STACK);
                           DBMS_OUTPUT.PUT(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);

【问题讨论】:

【参考方案1】:

在将DBMS_OUTPUT 命令移到FND_FILE 命令上方后,我得到了这个工作。最初我没有通过并发测试。我认为在DBMS_OUTPUT 之前运行的FND_FILE 命令导致异常无法运行DBMS_OUTPUT

删除聚合后,程序仍然可以编译,但也会产生运行时错误。

FND_FILE 命令只能通过并发工作。

顺便说一下,对于那些不知情的人,FORMAT_ERROR_STACK 给出类似 ORA-30926:无法在源表中获得一组稳定的行,FORMAT_ERROR_BACKTRACE 给出 ORA-06512:在“ORA-06512 :在“APPS.procedureName”,第 21 行

MERGE INTO xxcb_RTL_inbnd_shipments_iface A
USING (select DISTINCT aa.shipment_line_id,aa.transaction_type,aa.last_update_date--max(aa.last_update_date) 
       from rcv_transactions aa  --may need to examine PO or ISO/Req instead?
           right join xxcb_RTL_inbnd_shipments_iface bb on aa.shipment_line_id=bb.shipment_line_id
       where --aa.transaction_type='DELIVER' 
           bb.interface_status='RELEASED'
       --group by aa.shipment_line_id,aa.transaction_type
       ) B ON (a.shipment_line_id=b.shipment_line_id)
when matched then update set a.interface_status='CLOSED'
                            ,a.interface_last_update=sysdate
                            ,a.interface_update_by='ORACLE'
where a.interface_status='RELEASED';
exception when others 
    then dbms_output.put_line('Error!');
        DBMS_OUTPUT.PUT_line(DBMS_UTILITY.FORMAT_ERROR_STACK);
        DBMS_OUTPUT.PUT_line(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);  
        FND_FILE.PUT_LINE(FND_FILE.LOG,'Error!');
        FND_FILE.PUT_LINE(FND_FILE.LOG,DBMS_UTILITY.FORMAT_ERROR_STACK);           
        FND_FILE.PUT_LINE(FND_FILE.LOG,DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);

【讨论】:

以上是关于将 pl sql 异常错误写入 DBMS_OUTPUT 和 FND_FILE 作业日志的主要内容,如果未能解决你的问题,请参考以下文章

为啥在匿名 PL/SQL 块中没有立即引发异常?

PL/SQL 异常和错误处理

PL/SQL系统定义的异常操作实例讲解

PL/SQL 异常错误处理

SQL记录-PLSQL异常

检查 PL/SQL 异常块中的特定错误代码