oracle 使用PL/SQL apex_web_service.make_rest_request中的p_parm_values上载二进制大对象

eyh26e7m  于 2022-12-18  发布在  Oracle
关注(0)|答案(2)|浏览(166)

我正在尝试使用Apex(云)运行PL/SQL脚本,该脚本从表中获取BLOB对象,并通过POST API调用将其发送到Alfresco服务器。
如果我使用Postman/Insomnia进行API调用,我会执行以下操作:
1.将内容类型设置为“multipart/form-data”
1.在正文中添加一个名为“filedata”的键
1.对于它的值,我将从本地文件系统中选择一个文件

我会将其作为POST请求发送,并进行基本身份验证。
我在使用PL/SQL和APEX_WEB_SERVICE模块进行复制时遇到问题。下面是我正在尝试的代码:

DECLARE
    f_attachment BLOB;
    f_response CLOB;
    v_login VARCHAR2(100);
    v_password VARCHAR2(100);
    l_offset     INT := 1;
    p_clob CLOB;
BEGIN
    v_login := '***';
    v_password := '***';
    
    
    
    SELECT PDF INTO f_attachment FROM VIPUL_TEST WHERE ID=2;
    
    
    apex_web_service.g_request_headers.delete;
    apex_web_service.g_request_headers(1).name := 'Content-Type';
    apex_web_service.g_request_headers(1).value := 'multipart/form-data';
    
    f_response := apex_web_service.make_rest_request(p_url => 'https://systest.eisenvault.net/alfresco/api/-default-/public/alfresco/versions/1/nodes/2b9d7fc9-a12e-4e0b-89b2-e556ddfd2778/children',  
                                                     p_http_method => 'POST',
                                                     p_username => v_login,
                                                     p_password => v_password,
                                                     p_parm_name => apex_util.string_to_table('filedata'),
                                                     p_parm_value => apex_util.string_to_table(apex_web_service.blob2clobbase64(f_attachment))

    );
    
    

    -- Print out the CLOB fetched from Database
    p_clob := apex_web_service.blob2clobbase64(f_attachment);

    dbms_output.put_line('Print CLOB');    
    loop  
        exit when l_offset > dbms_lob.getlength(p_clob);  
        dbms_output.put_line( dbms_lob.substr( p_clob, 255, l_offset ) );  
        l_offset := l_offset + 255;  
    end loop; 
    -- Finish Printing
END;

我收到以下错误:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 21
ORA-06512: at "SYS.DBMS_SQL", line 1721

1. DECLARE
2.  f_attachment BLOB;
3.  f_response CLOB;
4.  v_login VARCHAR2(100);

看起来clob不能作为p_parm_value中的值传递。您能建议一种方法来实现这一点吗?有没有办法将Blob或Clob转换为字符串?我不愿意将其转换为varchar类型,因为它的上限是32 kb(对吗?),而这些附件的大小可能是数GB。

gev0vcfq

gev0vcfq1#

我们自己解决了这个问题。下面是有效的代码。

DECLARE
    l_clob clob;    
    l_json clob;
    lb_blob blob;
    l_body clob;
    lv_filename      VARCHAR2(20)  := 'my_file.pdf';
    lm_multipart     apex_web_service.t_multipart_parts;

BEGIN
    SELECT PDF
      INTO lb_blob
      FROM VIPUL_TEST WHERE ID = 3;

  apex_web_service.APPEND_TO_MULTIPART (
                p_multipart    => lm_multipart,
                p_name         => 'filedata',
                p_filename     => lv_filename,
                p_content_type => 'application/octet-stream',
                p_body_blob    => lb_blob );

 l_clob := apex_web_service.make_rest_request(
              p_url => 'https://systest.eisenvault.net/alfresco/api/-default-/public/alfresco/versions/1/nodes/2b9d7fc9-a12e-4e0b-89b2-e556ddfd2778/children',
              p_username => '***',
              p_password => '***',
              p_http_method => 'POST',
              p_body_blob => apex_web_service.generate_request_body(lm_multipart));
              

    dbms_output.put_line(to_char(l_clob));
END;
/
mwkjh3gx

mwkjh3gx2#

您应该尝试通过APEX_WEB_SERVICE.MAKE_REST_REQUEST函数的以下参数发送它:

p_body_blob IN BLOB default empty_blob()

相关问题