尝试访问另一个模式时获取 PLS-00201 table

Getting PLS-00201 when trying to access another schema table

我想清理 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: identifier 'XYZ_TABLE' must be declared.

我尝试了 "SCHEMA_ADM"."XYZ_TABLE" 而不是 "XYZ_TABLE",但也没有用。 SCHEMA_DAT 对 SCHEMA_ADM 有一个 SIUD 角色,对 XYZ_TABLE 有一个 SYNONYM,但在研究中我发现存储过程不能使用角色的授予。但是我没有找到任何方法来授予 PROCEDURE 编译时没有错误的权限,并保证 SCHEMA_APP 也可以调用该过程。有什么帮助吗?谢谢!

编辑:我发现 this similar question,4 年前问过,但没有确定的答案:/

此错误的检查清单应如下所示:

  1. table XYZ_TABLE 存在吗? (你拼对了吗?它实际上在 double-quotes 中命名为 "xyz_table""XYZ Table" 之类的东西吗?)
  2. 它是否在预期的模式中,SCHEMA_ADM
  3. SELECT 等特权是否直接授予包所有者,SCHEMA_DAT
  4. 预期名称是否有私有或 public 同义词? (例如,table Y 可能有同义词 X,但代码指的是 Y。)
  5. 或者,代码是否以模式名称作为前缀,例如SCHEMA_DAT.XYZ_TABLE?
  6. 是否有与架构同名的包或类型 (SCHEMA_DAT)?这可能会造成命名冲突,编译器会找到包而不是架构,然后在其中查找名为 XYZ_TABLE.
  7. 的内容

您的要求可能会有所不同,但创建同义词通常比对模式名称进行硬编码更好(键入更少,如果情况发生变化则更灵活),并且私有同义词优于 public 同义词(安全性,因为它们不会广播您的模式结构,并且在您想要将不同的用户定向到不同的对象或稍后添加具有不同要求的另一个模式时更加灵活)。