将plsql异常错误写入DMBS_OUTPUT和FND_FILE作业日志

时间:2019-07-10 19:24:39

标签: sql exception plsql oracle12c

我有一条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 个答案:

答案 0 :(得分:0)

DBMS_OUTPUT命令移到FND_FILE命令上方后,我开始工作了。最初,我不是通过并发进行测试。我认为FND_FILE之前运行的DBMS_OUTPUT命令导致异常无法运行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);