必须将PLS-00201标识符声明为引用用户定义的类型为SYS

时间:2015-03-09 22:29:28

标签: oracle plsql privileges user-defined-types

我在我的包创建脚本中遇到某些已定义TYPE的问题 -

我收到某些TYPE的以下内容

PLS-00201 identifier must be declared 

例如;

Error(7,23): PLS-00201: identifier 'another_schema.some_table_type' must be declared
Error(8,23): PLS-00201: identifier 'another_schema.some_object_type' must be declared

我应该注意到我正在更改这些脚本 - 之前运行正常 - 以前它们作为脚本所有者运行,现在它只是一个容器模式/用户 - 并且创建脚本正在以SYS身份执行。 (它是一个开发数据库,​​到目前为止,我还没有创建一个用户除了SYS之外用它来执行此操作)

(先前编译的软件包 - 以具有适当权限的架构所有者身份运行。)

此包(以及各种其他对象,视图过程和函数)访问其架构中的两个对象以及另一个架构中的对象。

在这种情况下 - 问题在于引用模式中的一些已定义的TYPE(和类型表) - 我得到了PLS-00201错误。

在下面的代码中,为引用生成错误时编译错误;

      l_tc_data       another_schema.some_table_type := another_schema.some_table_type();
      l_tc_obj        another_schema.some_object_type;

但不是;

      l_loc_t        another_schema.location_ref_t; 

在同一"其他"架构。

create or replace PACKAGE BODY  example_schema.example_pkg 
AS
function getSomeData (p_project in varchar2, p_start_date in date, p_end_date in date, p_timezone in varchar2 := 'UTC')
return fancydatatabletype is
      l_cursor        SYS_REFCURSOR;
      l_tsdata        fancydatatabletype := fancydatatabletype();

      l_tc_data       another_schema.some_table_type := another_schema.some_table_type();
      l_tc_obj        another_schema.some_object_type;

      t_data          fancydatatype;
      l_project       VARCHAR2(20);
      l_timezone      VARCHAR2(40);
      l_start         DATE;
      l_end           DATE;

      l_loc_t        another_schema.location_ref_t; 
BEGIN
    l_tc_obj := another_schema.some_object_type(null, 1, 2, 3, 'test');

    -- .... more stuff
END getSomeData;

所以我的问题是;  1.这可能是特权问题吗? (以SYS身份运行)  2.我应该看看哪些其他东西会产生这个错误? (因为它们确实存在)

我可以成功查询TYPES,因此它们确实存在,命名相同而用户(在本例中为SYS)可以"参见"它们;

select * from ALL_TYPES where type_name like 'some_table_type%';

我知道我是愚蠢的,盲目的,或者只是在我的甲骨文技能的极限 - 所以希望有人可以帮助我弄清楚并在下次学习!

1 个答案:

答案 0 :(得分:1)

引用的对象归ANOTHER_SCHEMA所有。您正尝试在EXAMPLE_SCHEMA拥有的PL / SQL中使用它们。所以最可能的解释是两种模式之间的授权。

为了在代码中使用它们,ANOTHER_SCHEMA必须直接授予EXAMPLE_SCHEMA特权,即名称而不是角色。这是由于Oracle的安全模型的运作方式。

您可以查看现有的拨款:

select table_name as object_name
       , privilege
       , grantor
from dba_tab_privs
where grantee = 'EXAMPLE_SCHEMA'
and table_owner = 'ANOTHER_SCHEMA'
/