Oracle自定义对象中引用现有表字段报PLS-00201错误如何解决
问题描述
在Oracle数据库中创建自定义对象类型时,尝试在对象的成员方法参数中直接引用已存在数据表的字段类型,测试代码如下:
CREATE OR REPLACE TYPE MYOBJ AS OBJECT( MEMBER PROCEDURE MYEXPORT( ERRORS.ERRORS_ID%TYPE));
其中ERRORS是库中已经存在的数据表,执行上述建类型语句时,系统返回如下错误:
PLS-00201 - identifier must be declared.
错误原因
%TYPE是PL/SQL专属的类型锚定语法,仅支持在PL/SQL代码块、存储过程/函数、包、对象类型体的内部实现段中使用。而自定义对象类型的规范定义(CREATE TYPE语句)属于SQL层面的DDL操作,由SQL引擎解析执行,SQL引擎不识别表名.字段名%TYPE的写法,无法解析到对应的标识符,因此抛出PLS-00201错误。
解决方法
- 直接使用明确的原生数据类型定义参数
先查询ERRORS表ERRORS_ID字段的实际数据类型,在成员方法参数定义时直接写明对应类型即可,示例:
后续在编写TYPE BODY实现-- 假设ERRORS_ID实际类型为NUMBER(10) CREATE OR REPLACE TYPE MYOBJ AS OBJECT( MEMBER PROCEDURE MYEXPORT(P_ERROR_ID NUMBER(10)) ); /MYEXPORT方法的内部逻辑时,可以正常使用ERRORS.ERRORS_ID%TYPE做内部变量的类型锚定,不会触发报错。 - 抽象通用SQL级自定义类型统一引用
如果需要避免后续ERRORS_ID字段类型变更时需要同步修改多处代码,可以先创建SQL层面支持的自定义类型,建表和定义对象时统一引用该类型,示例:-- 定义全局通用的错误ID类型 CREATE OR REPLACE TYPE ERROR_ID_T IS NUMBER(10); / -- 建表时使用该自定义类型定义字段 CREATE TABLE ERRORS ( ERRORS_ID ERROR_ID_T PRIMARY KEY, -- 其余表字段按业务定义 ); / -- 定义对象类型时直接引用全局自定义类型 CREATE OR REPLACE TYPE MYOBJ AS OBJECT( MEMBER PROCEDURE MYEXPORT(P_ERROR_ID ERROR_ID_T) ); /
内容的提问来源于stack exchange,提问作者hajduk
相关产品推荐
相关产品推荐

