运行以下代码时出错。我已经创建了一个类型,但仍然得到一个错误:
PLS-00201:标识符"AST"必须声明为
请帮助我解决ORACLE 12C中的错误。
类型创建:
CREATE OR REPLACE TYPE "AST" AS VARRAY(255) OF varchar2(100);
包创建:
CREATE OR REPLACE PACKAGE ABC IS
FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE)
RETURN AST;
END ABC;
问题与您的
Type Definition
无关,前提是类型名称准确指定为AST
[不带引号]或"AST"
[带引号,但全部用大写字母]
如果您有一个名为Product
的表或视图,并且在当前架构中有一个列Attribute_Ua_Name
,则不会引发错误。
BUT
问题似乎是由于引号内的类型AST
的定义,但不是所有大写字母,如"AsT"
或"aST"
等。以下是此错误的测试用例
(在这种情况下,假设表Product
存在,并且有一列称为Attribute_Ua_Name
(:
SQL> CREATE OR REPLACE TYPE "AsT" AS VARRAY(255) OF varchar2(100);
2 /
Type created
SQL> CREATE OR REPLACE PACKAGE ABC IS
2 FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE) RETURN AST;
3 END ABC;
4 /
Warning: Package created with compilation errors
SQL> show err;
Errors for PACKAGE MYSCHEMA.ABC:
LINE/COL ERROR
-------- --------------------------------------------
2/89 PLS-00201: identifier 'AST' must be declared
2/3 PL/SQL: Declaration ignored
SQL> CREATE OR REPLACE TYPE "AST" AS VARRAY(255) OF varchar2(100);
2 /
Type created
SQL> CREATE OR REPLACE PACKAGE ABC IS
2 FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE) RETURN AST;
3 END ABC;
4 /
Package created
假设您确实在与表和包相同的模式中创建了类型,那么您所拥有的一切都很好;
CREATE OR REPLACE TYPE "AST" AS VARRAY(255) OF varchar2(100)
/
Type AST compiled
create table PRODUCT(Attribute_Ua_Name varchar2(30))
/
Table PRODUCT created.
CREATE OR REPLACE PACKAGE ABC IS
FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE)
RETURN AST;
END ABC;
/
Package ABC compiled
show errors
No errors.
如果您得到"PLS-00201:identifier‘AST’must be declared",那么您实际上并没有运行该语句,或者您在不同的模式中运行了它。如果它在不同的模式中,那么您可以在它前面加上拥有的模式名称
FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE)
RETURN owning_schema.AST;
我在同一个架构(ARCH(中创建了一个包和表,并且在不同的架构(INV_TEMP(中创建类型。
然后从INV_TEMP
模式中,您需要:
grant execute on AST to ARCH;
并且函数定义需要参考ARCH
模式中包规范中的类型所有者:
FUNCTION F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE)
RETURN INV_TEMP.AST;
在编写包主体时,函数还必须在定义中(以匹配规范(以及在声明INV_TEMP.AST
对象变量或创建对象作为查询的一部分时引用INV_TEMP
所有者。