运行以下代码时出现错误。我已经创建了一个类型,但是仍然出现错误:
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;
答案 0 :(得分:1)
该问题与您的
Type Definition
无关,只要类型名称完全指定为AST
[不带引号]或"AST"
[内用引号,但全部用大写字母表示]
如果您有一个名为Product
的表或视图,并且在当前目录中有一个名为Attribute_Ua_Name
的列模式,不会出现错误。
BUT 看来,问题出在引号内是AST
类型的定义,而不是{{1 }}或"AsT"
等。这是此错误的测试案例
(在这种情况下,假设表"aST"
存在并且具有名为Product
的列):
Attribute_Ua_Name
答案 1 :(得分:1)
假设您确实在与表和包相同的模式中创建类型,那么您的工作就很好了。
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:必须声明标识符'AST'”,则说明您实际上没有在运行该语句,或者在其他架构中运行过该语句。如果它在其他架构中,则可以在其前面加上拥有的架构名称
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
的所有者,无论是在定义中(以符合规范)还是在声明INV_TEMP.AST
对象变量或创建对象时作为查询的一部分。