Oracle创建表类型报错PLS-00201:SHAREDACCOUNTRECTYPE未声明
解决Oracle创建表类型时的PLS-00201错误
这问题我踩过!根源其实是Oracle的标识符大小写规则在搞鬼,咱们一步步理清楚:
问题原因
你创建对象类型时用了双引号:
create or replace TYPE "SharedAccountRecType" AS object( account_id NUMBER(11), share_by_id NUMBER(11), share_to_id NUMBER(11) );
Oracle对带双引号的标识符会严格保留大小写,所以这个类型实际在数据库里的名称是大小写混合的"SharedAccountRecType"。但你创建表类型时直接写了SharedAccountRecType,Oracle会自动把它转换成大写的SHAREDACCOUNTRECTYPE——数据库里根本没有这个大写的类型,自然就报PLS-00201: identifier 'SHAREDACCOUNTRECTYPE' must be declared错误了。
两种解决办法
办法一:保持带双引号的引用
创建表类型时,给对象类型名也加上双引号,和创建时的大小写完全一致:
create or replace TYPE "SharedAccountRecTypeCollection" as table of "SharedAccountRecType";
这样Oracle就能精准找到你之前创建的对象类型了。
办法二:放弃区分大小写(更推荐)
如果你的业务不需要区分标识符的大小写,后续创建对象时别用双引号,Oracle会自动把标识符统一存为大写,后续引用也不用加引号。
先重新创建对象类型(去掉双引号):
create or replace TYPE SharedAccountRecType AS object( account_id NUMBER(11), share_by_id NUMBER(11), share_to_id NUMBER(11) );
然后再执行你原来的表类型创建命令,就不会报错了:
create or replace TYPE "SharedAccountRecTypeCollection" as table of SharedAccountRecType;
(当然,表类型的名称也可以去掉双引号,保持统一)
小提示
Oracle的标识符规则总结:
- 不带双引号的标识符:自动转大写存储,引用时大小写不敏感(比如
SharedAccountRecType和sharedaccountrectype都会匹配到大写的SHAREDACCOUNTRECTYPE) - 带双引号的标识符:严格保留书写的大小写,引用时必须完全匹配并加双引号
内容的提问来源于stack exchange,提问作者sunny_dev
相关产品推荐
相关产品推荐

