Oracle 12c PL/SQL调用Web Service报ORA-28759错误求助
问题根因
报错ORA-28759: failure to open file是UTL_HTTP请求HTTPS接口时加载Oracle Wallet失败的典型错误,和接口可用性、已授予的包执行权限无关,问题全部出在Wallet加载环节。
排查修复步骤
- 修正Wallet路径格式
你代码中配置的Wallet路径为file:/u01/app/oracle/admin/DEVDBINST/wallet,Oracle解析本地文件路径要求file:后必须跟三个斜杠,少斜杠会把路径段识别为主机名,直接导致文件查找失败,正确路径写法为:v_wallet_path := 'file:///u01/app/oracle/admin/DEVDBINST/wallet'; - 校验目录与文件权限
Oracle数据库的运行操作系统用户(默认为oracle)必须对Wallet目录、目录下所有文件有可读权限,权限不足时路径正确也会报打开文件失败。登录数据库服务器执行以下命令验证:
如果执行上述命令返回权限错误,给对应目录、文件补充oracle用户的可读权限即可。# 切换到oracle用户 su - oracle # 查看目录下文件权限 ls -l /u01/app/oracle/admin/DEVDBINST/wallet/ # 验证核心Wallet文件可读 cat /u01/app/oracle/admin/DEVDBINST/wallet/cwallet.sso > /dev/null - 检查Wallet文件完整性
正常可被UTL_HTTP加载的Wallet目录必须包含自动登录文件cwallet.sso,如果目录下只有ewallet.p12没有该自动登录文件,UTL_HTTP无法传入Wallet密码完成加载,需要用orapki工具重新生成自动登录文件:orapki wallet create -wallet /u01/app/oracle/admin/DEVDBINST/wallet -auto_login -pwd <你的Wallet管理密码> - 校验Wallet内证书有效性
路径、权限、文件都正常的前提下,确认Wallet中已经导入目标HTTPS接口域名的根SSL证书,缺失证书会导致SSL握手阶段失败,部分场景下也会抛出同类文件打开错误。
代码存在的其他隐性问题
v_url变量仅做了声明,赋值语句被注释,实际运行时变量为NULL,Wallet问题修复后也会触发URL非法错误,需要把注释的URL赋值语句放到执行块中生效。- 变量
v_RR定义为NUMBER类型,代码中写v_RR := TO_CHAR(v_entire_msg);存在类型不匹配问题,接口返回内容无法转数字时会直接触发异常,要么将v_RR改为VARCHAR2类型,要么使用TO_NUMBER做合规的类型转换。 - 现有异常捕获逻辑直接吞掉所有错误,没有保留错误栈信息,排查问题时很难定位根因,建议异常分支增加错误日志输出。
内容的提问来源于stack exchange,提问作者AJORA
相关产品推荐
相关产品推荐

