错误:PLS-00201:必须在程序包中声明标识符“ AST”

时间:2018-07-27 12:55:49

标签: oracle stored-procedures plsql oracle12c pls-00201

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

  

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;

2 个答案:

答案 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对象变量或创建对象时作为查询的一部分。