Запись ошибок исключения plsql в журнал заданий DMBS_OUTPUT и FND_FILE - PullRequest
0 голосов
/ 10 июля 2019

У меня есть MERGE/UPDATE заявление.Я хочу добавить обработку исключений, чтобы в случае сбоя обновления по какой-либо причине записывать в DBMS_output и журнал заданий.Я что-то придумал - он компилируется нормально, но, похоже, не работает.

Я удалил MAX (дату) и группу так, чтобы программа выполнялась, но сам запрос завершается с ошибкой «невозможно получить стабильный набор строк» ​​- и все же ни одно исключение не вызывается.

Ценю любые рекомендации.

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 голосов
/ 11 июля 2019

Я получил это на работу после перемещения команд 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);
...