Oracle 19c本地库调用apex_web_service.make_rest_request报错求助
问题描述
已创建ACL并授予权限,但调用apex_web_service.make_rest_request时仍报错。以下PL/SQL块在apex.oracle.com可正常运行并向表中插入数据,但在本地Oracle 19c数据库(APEX版本22.2)中执行时出现错误,请排查问题所在。
错误截图:

PL/SQL代码:
DECLARE l_respclob CLOB; l_reqbody CLOB; v_access_token VARCHAR2(4000); l_Status VARCHAR2(200); BEGIN apex_web_service.g_request_headers(1).name := 'Content-Type'; apex_web_service.g_request_headers(1).value := 'application/json'; apex_json.initialize_clob_output; apex_json.open_object; l_reqbody := '{ "grant_type": "client_credentials", "client_id": "2KDLXfdDZAKdeRivIg4", "client_secret": "UqPvcfZ43yVbF0QlC58PcVYkSuSr6sTW88QTPUTEb56BGoH19goIj2Zzzxl" }'; l_respclob := apex_web_service.make_rest_request( p_url => 'https://git-ss.piwik.pro/auth/token', p_http_method => 'POST', p_body => l_reqbody ); v_access_token := JSON_VALUE(l_respclob, '$.access_token'); insert into TBL_MAKE_REQ(TOKEN) values (v_access_token); END;
排查步骤
1. 验证ACL配置完整性
虽然已创建ACL,但本地环境可能存在配置遗漏:
- 确认ACL已正确分配给当前执行用户:
SELECT * FROM DBA_NETWORK_ACLS WHERE HOST = 'git-ss.piwik.pro'; SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES WHERE HOST = 'git-ss.piwik.pro'; - 确保ACL包含
connect权限,且用户被授予该权限,有效期未过期。 - 若目标URL使用HTTPS,需确认ACL是否涵盖443端口,或未限制端口(端口设为
*)。
2. 检查Oracle Wallet/SSL配置
本地环境可能缺少SSL证书信任:
- 调用HTTPS接口时,Oracle需要信任目标站点的SSL证书。若本地未配置Oracle Wallet,或未将目标站点的根CA证书导入Wallet,会导致SSL握手失败。
- 验证APEX是否配置了正确的Wallet路径:进入APEX管理界面 → 实例设置 → 安全 → Web服务,确认“SSL Wallet”路径正确且可访问。
- 手动测试SSL连接:使用
utl_http测试目标URL,看是否能建立连接:DECLARE l_req utl_http.req; l_resp utl_http.resp; BEGIN utl_http.set_wallet('file:/path/to/your/wallet', 'wallet_password'); -- 替换为实际路径和密码 l_req := utl_http.begin_request('https://git-ss.piwik.pro/auth/token', 'POST'); utl_http.end_request(l_req); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Error: ' || sqlerrm); END;
3. 检查APEX Web服务参数设置
本地APEX实例的Web服务参数可能与apex.oracle.com不同:
- 确认
apex_web_service的代理设置:若本地网络需要通过代理访问外部站点,需配置APEX的代理服务器:BEGIN apex_instance_admin.set_parameter('PROXY_SERVER', 'proxy.example.com:8080'); -- 替换为实际代理 commit; END; - 检查Web服务超时设置:本地环境网络延迟较高,可能导致超时,可尝试增加超时参数:
修改make_rest_request调用,添加p_timeout参数:l_respclob := apex_web_service.make_rest_request( p_url => 'https://git-ss.piwik.pro/auth/token', p_http_method => 'POST', p_body => l_reqbody, p_timeout => 30 -- 设置30秒超时 );
4. 验证用户权限与APEX工作区关联
- 确认执行PL/SQL的用户是当前APEX工作区的有效用户,且被授予
APEX_WEB_SERVICE相关权限(如EXECUTE权限)。 - 检查是否在APEX环境中执行代码:若直接在SQL*Plus或PL/SQL Developer中执行,需确保用户已被授予访问APEX包的权限,且环境变量(如
APEX_SESSION_ID)正确设置(若依赖会话)。
5. 捕获详细错误信息
修改代码,添加异常处理,获取更详细的错误信息:
DECLARE l_respclob CLOB; l_reqbody CLOB; v_access_token VARCHAR2(4000); l_Status VARCHAR2(200); BEGIN apex_web_service.g_request_headers(1).name := 'Content-Type'; apex_web_service.g_request_headers(1).value := 'application/json'; l_reqbody := '{ "grant_type": "client_credentials", "client_id": "2KDLXfdDZAKdeRivIg4", "client_secret": "UqPvcfZ43yVbF0QlC58PcVYkSuSr6sTW88QTPUTEb56BGoH19goIj2Zzzxl" }'; l_respclob := apex_web_service.make_rest_request( p_url => 'https://git-ss.piwik.pro/auth/token', p_http_method => 'POST', p_body => l_reqbody ); v_access_token := JSON_VALUE(l_respclob, '$.access_token'); insert into TBL_MAKE_REQ(TOKEN) values (v_access_token); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('Error Code: ' || sqlcode); dbms_output.put_line('Error Message: ' || sqlerrm); dbms_output.put_line('APEX Web Service Error: ' || apex_web_service.g_status_code || ' - ' || apex_web_service.g_status_message); END;
执行后查看输出的详细错误,能更精准定位问题(如SSL错误、连接超时、权限不足等)。
内容的提问来源于stack exchange,提问作者Mohammad Ubaid
相关产品推荐
相关产品推荐

