解析来自具有 JSON 调用的 Oracle CLOB 的错误响应

问题描述 投票:0回答:1

我有以下代码,可从 APEX 调用生成响应有效负载。当网络服务成功时,响应就会很好。没问题。

但是,当响应有错误时,我无法使用 PLSQL API 显示错误及其完整描述。

但是,如果我使用相同的有效负载并通过 POSTMAN 或 SOAPUI 运行它,则会收到完整错误。

如何从 PLSQL 解析并接收完整的错误描述?

这是有问题的代码片段:

 l_resp := apex_web_service.make_rest_request(p_url => g_fusion_url,
         p_credential_static_id => l_crd,
         p_http_method => l_method, p_body => p_body);
         DBMS_OUTPUT.PUT_LINE('STATUSCODE:'||apex_web_service.g_status_code);
        IF apex_web_service.g_status_code >= 400 THEN
            apex_debug.info('Request Body is %s', sys.dbms_lob.substr(l_resp, 4000, 1));

            raise_application_error(-20001, 'API Error2: '
                                            || apex_web_service.g_status_code
                                            || '-'
                                            || sys.dbms_lob.substr(l_resp, 1, 531));--1.4

如果我通过 SOAP UI 运行有效负载,您会看到,我们得到完整的描述

但是 SQL Developer 或 SQL Plus 中的相同 API 仅提供以下内容,这是不够的。

Error report -
ORA-20001: Error in Main:[Brkpoint:M01|-20004|ORA-20004: Error in apinvoices:ORA-20004: Error in Request_fusion:ORA-20001: API Error2: 400-
ORA-06512: at "PROCORE_WH_DATA.XXMOR_RR_BILLING_INVOICE_PROC", line 689
ORA-06512: at line 1]
ORA-06512: at "PROCORE_WH_DATA.XXMOR_RR_BILLING_INVOICE_PROC", line 52
ORA-06512: at line 4

请告知我该如何解决这个问题。我的要求是,我想捕获完整长度的错误消息,就像它在 PLSQ 调用的 SOAP UI 中显示的那样。

谢谢你 达什

json oracle plsql oracle-apex clob
1个回答
0
投票

您的问题可能是 SubStr() 与 dbms_lob.SubStr() 函数中参数 2 和 3 的位置不同(交换位置)。
SubStr(字符、位置、长度)
dbms_lob.SubStr(clob,金额,偏移量)

您的代码 dbms_lob.substr(l_resp, 1, 531) 结果在位置 531 处有 1 个字符

请看下面的代码:

SET SERVEROUTPUT ON
Declare
    my_text_varchar     VarChar2(10) := '0123456789';
    my_text_clob        CLOB := '0123456789';
Begin
    dbms_output.put_line('SubStr(my_text_varchar, 1, 10)        --->' || SubStr(my_text_varchar, 1, 10));
    dbms_output.put_line('dbms_lob.SubStr(my_text_clob, 1, 10): --->' || dbms_lob.SubStr(my_text_clob, 1, 10));
    --
    dbms_output.put_line('dbms_lob.SubStr(my_text_clob, 10, 1): --->' || dbms_lob.SubStr(my_text_clob, 10, 1));
End;
/
--  R e s u l t :
--  SubStr(my_text_varchar, 1, 10)        --->0123456789
--  dbms_lob.SubStr(my_text_clob, 1, 10): --->9
--  dbms_lob.SubStr(my_text_clob, 10, 1): --->0123456789
© www.soinside.com 2019 - 2024. All rights reserved.