编译存储过程报PLS-00201:标识符'rep_table_T'必须声明如何解决
报错原因
- 标识符大小写不匹配:创建自定义类型时使用了双引号包裹类型名
"rep_table_O"、"rep_table_T",Oracle中被双引号包裹的标识符会强制保留大小写,后续引用时必须也用双引号包裹完全一致的名称才能识别。你在存储过程中直接写rep_table_T没有加双引号,Oracle会默认转换为全大写的REP_TABLE_T去查找类型,自然找不到你创建的小写名称的类型,触发PLS-00201报错。 - 类型属性使用错误:
%ROWTYPE是Oracle中用于获取数据表、视图的行记录类型的语法,仅适用于关系表/视图对象。你定义的rep_table_T是嵌套表集合类型,不能使用%ROWTYPE修饰:- 如果你要传入/传出嵌套表中单个对象元素,参数类型应该直接写
rep_table_O - 如果你要传入/传出整个嵌套表集合,参数类型应该直接写
rep_table_T,无需加%ROWTYPE
- 如果你要传入/传出嵌套表中单个对象元素,参数类型应该直接写
解决方案
方案一(推荐,移除大小写强制约束)
重建类型时去掉双引号,Oracle会默认将标识符转为大写存储,后续引用不需要加双引号,适配常规写法:
- 重建对象类型:
create or replace TYPE rep_table_O AS OBJECT ( day VARCHAR2(250 BYTE), TS DATE );
- 重建嵌套表类型:
create or replace TYPE rep_table_T AS TABLE OF rep_table_O;
- 根据需求修改存储过程参数:
- 传入/传出整个嵌套表集合的写法:
create or replace PROCEDURE MY_HELPER (rep_table_row IN OUT rep_table_T) IS ... END MY_HELPER ;
- 传入/传出嵌套表中单个对象行的写法:
create or replace PROCEDURE MY_HELPER (rep_table_row IN OUT rep_table_O) IS ... END MY_HELPER ;
方案二(保留大小写强制约束)
如果确实需要保留小写的类型名,引用时必须加双引号,同时修正%ROWTYPE错误,示例(传整个集合):
create or replace PROCEDURE MY_HELPER (rep_table_row IN OUT "rep_table_T") IS ... END MY_HELPER ;
内容的提问来源于stack exchange,提问作者hajduk
相关产品推荐
相关产品推荐

