我想清理SCHEMA_ADM和SCHEMA_DAT表上的一些数据,但是,我的程序需要存储在SCHEMA_DAT上,并由SCHEMA_APP调用。我做了这样的程序:
create or replace PACKAGE BODY "PKG_CLEANING_THE_MESS"
AS
PROCEDURE PRC_DELETE_DATA (some variables...)
AS
TYPE fooTableType
IS TABLE OF FOO_TABLE.ID%TYPE; --TABLE ON SCHEMA_DAT. Works fine!
fooTable fooTableType;
TYPE xyzTableType
IS TABLE OF XYZ_TABLE.ID%TYPE; --TABLE ON SCHEMA_ADM. The problem is here!!!
xyzTable xyzTableType;
...
END PRC_DELETE_DATA;
...
END PKG_CLEANING_THE_MESS;
当我尝试编译时,请给我
PLS-00201:标识符' XYZ_TABLE'必须宣布。
我试过" SCHEMA_ADM"。" XYZ_TABLE"而不只是" XYZ_TABLE",但也没有效果。 SCHEMA_DAT对SCHEMA_ADM和SYNONYM到XYZ_TABLE具有SIUD角色,但在进行研究时我发现存储过程不能使用角色授权。但我没有找到任何方法让PROCEDURE上的授权编译没有错误,并保证SCHEMA_APP也可以调用该程序。对此有何帮助?谢谢!
编辑:4年前,我发现了this similar question,但没有得出确凿的答案:/答案 0 :(得分:2)
此错误的核对清单应如下所示:
XYZ_TABLE
是否存在? (你拼错了吗?它实际上是用双引号命名为"xyz_table"
还是"XYZ Table"
?)SCHEMA_ADM
?SCHEMA_DAT
?X
可能有同义词Y
,但代码引用Y
。)SCHEMA_DAT.XYZ_TABLE
?SCHEMA_DAT
)同名的包或类型?这可能会在编译器找到包而不是模式时创建命名冲突,然后在其中查找名为XYZ_TABLE
的内容。您的要求可能会有所不同,但创建同义词通常比对模式名称进行硬编码更好(对于类型更少,如果事情发生变化则更灵活),并且私有同义词优于公共同义词(安全性,如他们不会广播您的架构结构,如果您想将不同的用户定向到不同的对象,或者稍后根据不同的要求添加另一个架构,则会更灵活。)