我正在获取" ORA-00904无效的标识符"错误,试图使用我的模式中的函数中的另一个模式。我正在使用该功能的完全合格的名称,并通过授予的角色在功能上执行特权。
直接从我的模式执行功能。但是从我的架构中的函数调用该函数并没有给出904错误。
示例:
我正在尝试在称为schema_a的架构中编译一个名为proc_a的过程。
proc_a使用来自schema_b的proc_b的函数的输出。
schema_a可以通过角色访问proc_b。schema_a可以直接运行proc_b,但不能在函数/过程中使用它。在过程中使用它会导致汇编失败。
以下是一个代码示例,可证明问题:
CREATE OR REPLACE FUNCTION schema_b.proc_b
RETURN DATE IS
BEGIN
RETURN sysdate;
END;
/
CREATE ROLE run_query
/
GRANT EXECUTE ON schema_b.proc_b TO run_query
/
GRANT run_query TO schema_a
/
-- this will fail to compile with the ORA-904 invalid identifier error
CREATE OR REPLACE FUNCTION schema_a.proc_a
RETURN NUMBER IS
BEGIN
FOR c IN (SELECT schema_b.proc_b() FROM dual) LOOP --> this function call causes the error
NULL;
END LOOP;
RETURN 5;
END;
/
运行Oracle 11g R2
特权必须是直接的(未授予ROLE
(。
如果您更改了赠款:
GRANT EXECUTE ON schema_b.proc_b TO run_query
/
to:
GRANT EXECUTE ON schema_b.proc_b TO schema_a;
/
schema_a
中的因程序应编译。