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

Oracle 19c下sqlplus可调用DVF.F$LANGUAGE()但ODBC调用失败是什么原因?

问题根因与解决方案

核心原因

  1. Database Vault权限控制拦截:DVF是Oracle Database Vault组件的专属Schema,F$LANGUAGE是其内置函数。默认即便是SYSTEM这类DBA用户,也仅被授予了PL/SQL上下文下的调用权限,ODBC的直接SQL调用链路会触发Database Vault更严格的权限校验,被拦截后返回“访问违规”的报错(该错误和语法错误共用同一错误码,所以提示会包含语法错误的描述)。
  2. 调用上下文差异:你在sqlplus中是在PL/SQL匿名块内调用,走的是PL/SQL权限校验逻辑,只要用户有基础执行权限即可通过;但ODBC的{? = CALL ...}语法走的是SQL原生调用链路,Database Vault会对这类外部调用做额外校验,默认DBA用户也没有开通该权限。
  3. 你可以正常调用SYSTEM.XYZ()是因为该函数属于SYSTEM用户自有对象,不受Database Vault权限规则限制。

解决步骤

若已启用Oracle Database Vault功能

  1. 使用拥有DV_OWNER角色的用户或SYS用户登录ORCLPDB容器,给SYSTEM用户授予对应执行权限:
ALTER SESSION SET CONTAINER=ORCLPDB;
GRANT EXECUTE ON DVF.F$LANGUAGE TO SYSTEM;

如果执行后仍报错,需要检查Database Vault的规则集配置,确认没有拦截SYSTEM用户对该函数的调用。
2. ODBC调用时给函数名加双引号,避免部分版本的ODBC驱动将$符号误解析为变量前缀:

{? = CALL DVF."F$LANGUAGE"()}

未启用Oracle Database Vault功能

  1. 直接给SYSTEM用户授予函数执行权限即可:
ALTER SESSION SET CONTAINER=ORCLPDB;
GRANT EXECUTE ON DVF.F$LANGUAGE TO SYSTEM;
  1. 也可以创建公共同义词简化后续调用:
CREATE PUBLIC SYNONYM F$LANGUAGE FOR DVF.F$LANGUAGE;
GRANT EXECUTE ON F$LANGUAGE TO PUBLIC;
-- 后续ODBC调用可直接写为 {? = CALL F$LANGUAGE()}

验证方式

权限配置完成后,先在sqlplus中用SYSTEM用户登录ORCLPDB,执行直接SQL调用测试:

SELECT DVF.F$LANGUAGE() FROM DUAL;

如果能正常返回结果,说明权限配置正确,ODBC调用即可正常执行。


内容的提问来源于stack exchange,提问作者Christian Reinbothe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:39:00