[英]Upload a blob using p_parm_values in PL/SQL apex_web_service.make_rest_request
我正在嘗試使用 Apex(雲)運行 PL/SQL 腳本,該腳本從表中獲取 BLOB object 並通過 POST API 調用將其發送到 Alfresco 服務器。
如果我使用 Postman/Insomnia 撥打 API 電話,我會執行以下操作:
我會將其作為帶有基本身份驗證的 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 類型,因為它的上限為 32kb(對嗎?),而這些附件的大小可能為數 GB。
我們自己解決了這個問題。 下面是有效的代碼。
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;
/
您應該嘗試通過 APEX_WEB_SERVICE.MAKE_REST_REQUEST function 的以下參數發送它:
p_body_blob IN BLOB default empty_blob()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.