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

mwecs4sa  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(125)

我有一个以下的代码,从APEX调用生成响应有效载荷。当Web服务成功时,响应就出来了。没有问题。
但是,当响应有错误时,我无法使用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运行Payload,你会看到,我们得到完整的描述

但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中显示的那样。
感谢Darsh

piv4azn7

piv4azn71#

你的问题可能是SubStr()函数和dbms_lob.SubStr()函数中参数2和3的位置不同(交换位置)。

SubStr(char,position,length)
dbms_lob.SubStr(clob,amount,offset)

代码dbms_lob.substr(l_resp,1,531)的结果是在位置531处有1个字符
你可能需要的是 SubStr(l_resp,1,531),因为你已经有了4000个字符的l_resp字符串。
代码如下:

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

相关问题