You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定CURL命令转换为PL/SQL代码?

将CURL转换为PL/SQL实现

要在PL/SQL中执行你的POST请求,可以使用Oracle内置的UTL_HTTP包。以下是完整的实现代码及前置配置说明:

前置配置(需DBA操作)

  1. 授予用户执行UTL_HTTP的权限:
GRANT EXECUTE ON UTL_HTTP TO your_username;
  1. 配置网络访问控制列表(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;
/
  1. 处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:22:54