如何将指定CURL命令转换为PL/SQL代码?
将CURL转换为PL/SQL实现
要在PL/SQL中执行你的POST请求,可以使用Oracle内置的UTL_HTTP包。以下是完整的实现代码及前置配置说明:
前置配置(需DBA操作)
- 授予用户执行
UTL_HTTP的权限:
GRANT EXECUTE ON UTL_HTTP TO your_username;
- 配置网络访问控制列表(ACL),允许访问目标域名:
BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl => 'zatca_gateway_acl.xml', description => 'Allow access to ZATCA e-invoicing gateway', principal => 'your_username', is_grant => TRUE, privilege => 'connect' ); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'zatca_gateway_acl.xml', host => 'gw-fatoora.zatca.gov.sa', lower_port => 443, upper_port => 443 ); COMMIT; END; /
- 处理HTTPS SSL证书(二选一):
- 生产环境:配置Oracle Wallet并指向证书存储路径:
UTL_HTTP.SET_WALLET('file:/path/to/your/wallet', 'wallet_password'); - 测试环境:临时禁用证书验证(不推荐生产):
UTL_HTTP.SET_WALLET('');
PL/SQL执行代码
DECLARE req UTL_HTTP.REQ; resp UTL_HTTP.RESP; buffer VARCHAR2(32767); json_body VARCHAR2(32767); BEGIN -- 构造请求体JSON json_body := q'[ { "csr": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tL1WVh3eUxUSXpOSHd6TFRNMU5ERWYKTUIwR0NnbVNKb21UOGl4a0FRRU1Eek14TURFM05UTTVOelF3TURBd016RU5NQXNHQTFVRURBd0VNVEV3TURFUQpNQTRHQTFVRUdnd0hXbUYwWTJFZ016RVlNQllHQTFVRUR3d1BSbTl2WkNCQ2RYTnphVzVsYzNNek1Bb0dDQ3FHClNNNDlCQU1DQTBjQU1FUUNJQ3JyTzdtSzZWZTZNTmIrSlNJRkRmK0FGMjhqV2ZJYTNIdzlhWEdVOS9KbkFpQXIKSnBVc0h4Z1RrOGtQZTRQSnNJVGJJYXlTeUh2emZwdHFFTWZEajdQN2F3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0t" } ]'; -- 初始化HTTP请求 req := UTL_HTTP.BEGIN_REQUEST( url => 'https://gw-fatoora.zatca.gov.sa/e-invoicing/developer-portal/compliance', method => 'POST' ); -- 设置请求头 UTL_HTTP.SET_HEADER(req, 'accept', 'application/json'); UTL_HTTP.SET_HEADER(req, 'OTP', '123345'); UTL_HTTP.SET_HEADER(req, 'Accept-Version', 'V2'); UTL_HTTP.SET_HEADER(req, 'Content-Type', 'application/json'); UTL_HTTP.SET_HEADER(req, 'Content-Length', LENGTH(json_body)); -- 发送请求体 UTL_HTTP.WRITE_TEXT(req, json_body); -- 获取响应 resp := UTL_HTTP.GET_RESPONSE(req); -- 读取并输出响应内容 DBMS_OUTPUT.PUT_LINE('Response Status: ' || resp.status_code || ' ' || resp.reason_phrase); DBMS_OUTPUT.PUT_LINE('Response Headers:'); FOR i IN 1..UTL_HTTP.GET_HEADER_COUNT(resp) LOOP DBMS_OUTPUT.PUT_LINE(' ' || UTL_HTTP.GET_HEADER_NAME(resp, i) || ': ' || UTL_HTTP.GET_HEADER_VALUE(resp, i)); END LOOP; DBMS_OUTPUT.PUT_LINE('Response Body:'); LOOP UTL_HTTP.READ_LINE(resp, buffer, TRUE); DBMS_OUTPUT.PUT_LINE(buffer); END LOOP; -- 关闭请求和响应 UTL_HTTP.END_RESPONSE(resp); UTL_HTTP.END_REQUEST(req); EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(resp); UTL_HTTP.END_REQUEST(req); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM); IF UTL_HTTP.IS_OPEN(resp) THEN UTL_HTTP.END_RESPONSE(resp); END IF; IF UTL_HTTP.IS_OPEN(req) THEN UTL_HTTP.END_REQUEST(req); END IF; RAISE; END; /
说明
- 使用
q'[]'语法包裹JSON字符串,避免手动转义双引号 - 代码包含完整的异常处理,确保请求/响应资源被正确释放
- 可通过
DBMS_OUTPUT查看响应内容,生产环境可将响应存储到表中或进一步处理
内容的提问来源于stack exchange,提问作者Mohammed almalki
相关产品推荐
相关产品推荐

