我正在尝试使用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。
2条答案
按热度按时间gev0vcfq1#
我们自己解决了这个问题。下面是有效的代码。
mwkjh3gx2#
您应该尝试通过APEX_WEB_SERVICE.MAKE_REST_REQUEST函数的以下参数发送它: