PLS-00201 标识符必须声明为引用用户定义类型为 SYS
PLS-00201 identifier must be declared referencing user defined type as SYS
我的包创建脚本中的某些定义类型有问题 -
我收到了某些类型的以下内容
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
我应该注意,我正在更改这些脚本 - 运行 以前很好 - 以前它们 运行 作为脚本所有者,现在只是一个容器 schema/user -并且创建脚本正在作为 SYS 执行。 (这是一个开发数据库,到目前为止,除了 SYS 之外,他们还没有为我创建一个用户来执行此操作)
(之前编译的包 - 当 运行 作为具有适当权限的架构所有者时。)
此包(以及各种其他对象、视图过程和函数)访问其架构拥有的对象以及另一个架构中的对象。
在这种情况下 - 问题出在引用模式中的某些定义的类型(和类型表) - 我在其中收到 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;
它们在同一个 "other" 架构中。
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.这可能是特权问题吗? (运行宁作为系统)
2. 我还应该查看哪些其他可能会产生此错误的内容? (因为它们确实存在)
我可以成功查询 TYPES,所以它们确实存在,名称相同,用户(在本例中为 SYS)可以 "see" 它们;
select * from ALL_TYPES where type_name like 'some_table_type%';
我知道我在 Oracle 技能的极限上是愚蠢的、盲目的或只是简单 - 所以希望有人能帮助我弄清楚并在下次学习!
引用的对象归 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'
/
我的包创建脚本中的某些定义类型有问题 -
我收到了某些类型的以下内容
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
我应该注意,我正在更改这些脚本 - 运行 以前很好 - 以前它们 运行 作为脚本所有者,现在只是一个容器 schema/user -并且创建脚本正在作为 SYS 执行。 (这是一个开发数据库,到目前为止,除了 SYS 之外,他们还没有为我创建一个用户来执行此操作)
(之前编译的包 - 当 运行 作为具有适当权限的架构所有者时。)
此包(以及各种其他对象、视图过程和函数)访问其架构拥有的对象以及另一个架构中的对象。
在这种情况下 - 问题出在引用模式中的某些定义的类型(和类型表) - 我在其中收到 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;
它们在同一个 "other" 架构中。
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.这可能是特权问题吗? (运行宁作为系统) 2. 我还应该查看哪些其他可能会产生此错误的内容? (因为它们确实存在)
我可以成功查询 TYPES,所以它们确实存在,名称相同,用户(在本例中为 SYS)可以 "see" 它们;
select * from ALL_TYPES where type_name like 'some_table_type%';
我知道我在 Oracle 技能的极限上是愚蠢的、盲目的或只是简单 - 所以希望有人能帮助我弄清楚并在下次学习!
引用的对象归 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'
/