错误:PLS-00201:必须在包中声明标识符'AST'



运行以下代码时出错。我已经创建了一个类型,但仍然得到一个错误:

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所有者。

最新更新