Plsql PL/SQL类型不';换桌子的时候不要换

Plsql PL/SQL类型不';换桌子的时候不要换,plsql,types,oracle11g,Plsql,Types,Oracle11g,我在Oracle 11.2.0.3数据库中创建了此包,其中包含PL/SQL类型: CREATE OR REPLACE PACKAGE "DBATCK"."PKG_TCK_MGMTCK" AS ... TYPE TYPE_SHOW_USR is table of DBATCK.VW_SHOW_USR%ROWTYPE; ... END PKG_TCK_MGMTCK; / Oracle自动创建一个名为 create or replace type SYS_PLSQL_342468_34_1

我在Oracle 11.2.0.3数据库中创建了此包,其中包含PL/SQL类型:

CREATE OR REPLACE PACKAGE "DBATCK"."PKG_TCK_MGMTCK" AS

...

TYPE TYPE_SHOW_USR
is table of DBATCK.VW_SHOW_USR%ROWTYPE;

...

END PKG_TCK_MGMTCK;
/
Oracle自动创建一个名为

create or replace type SYS_PLSQL_342468_34_1 as object 
(
 "IDCODEAMB" NUMBER,
 "DESCRAMB" VARCHAR2(50 BYTE),
 "IDCODEAPP" VARCHAR2(7 BYTE),
 "DESCRAPP" VARCHAR2(50 BYTE)
); 
但是如果我将表
SHOW_USR
和视图
VW_TCK_USERS
中的
DESCRAPP
列从
varchar2(50)
更改为
varchar2(100)
,当我重新编译包
PKG_TCK_MGMTCK
时,PL/SQL类型不会改变

为什么?



在针对视图而不是表定义集合类型时,这似乎是一个错误。更改表定义会使视图和包规格/正文按预期失效,但不会使类型1失效;因此,当视图和包在下一次引用时被隐式重新编译时,类型似乎被忽略了

重新编译包或视图,甚至显式地重新发出包规范和主体的
create或replace
命令,似乎没有任何效果

即使在重新创建包之前完全删除该包也无济于事,因为类型链接到视图而不是包(相关对象的ID是类型名称的一部分)

您可以删除视图,然后重新创建该视图,然后下一个包引用也将重新创建该类型;但是,您必须恢复对它的特权(当然,它不会短暂存在,因此如果您尝试在维护窗口之外这样做,其他事情可能会因此失败)

你不必那么残忍。尽管重新编译视图没有帮助,但就地重新定义视图会:

create or replace view VW_SHOW_USERS as select * from SHOW_USR;
这应该比删除它的破坏性小,因为对视图的特权将被保留

我创建了一个视图,显示了最初的问题和各种不成功的纠正尝试,然后是视图重新定义



1如果集合是直接针对表而不是视图定义的,则类型也会被
alter table
无效,因此它会使用新定义重新编译,并且不会出现此问题。使用视图时,在评估依赖项时,似乎遗漏了一些内容。可能值得向Oracle提出服务请求,以便对此进行调查。(我只能在12cR2之前验证这种行为;也许有人可以验证18中发生了什么?

那么表
show_usr
是如何定义的?也许Oracle自动创建了另一种类型?J.Chomel否,并且包使用了旧的列数据类型您是否重新编译了视图?如果我删除了包(删除包“DBATCK”)。“PKG_TCK_MGMTCK”)类型SYS_PLSQL_342468_34_1仍然存在。@MicheleM-确实如此,当我查看时,我一定已经将包和视图一起丢弃了。类型链接到了视图,而不是包。(342468应该是
所有对象
视图中视图的
对象id
)。我已经更新了我的答案。谢谢。
create or replace view VW_SHOW_USERS as select * from SHOW_USR;