【问题标题】:Error: PLS-00201: identifier 'AST' must be declared in Package错误:PLS-00201:必须在包中声明标识符“AST”
【发布时间】:2019-01-04 14:34:12
【问题描述】:

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

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;

【问题讨论】:

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


    【解决方案1】:

    问题与您的Type Definition 无关,前提是类型名称完全指定为AST [ 不带引号] 或"AST" [ 带引号但全部大写]

    如果您有一个名为Product视图,并且在您的当前 架构中有一个名为Attribute_Ua_Name 的列,不会引发错误。

    BUT 问题似乎是由于在引号内定义了类型 AST 而不是全部大写,例如 "AsT" 或 @ 987654328@等。这是这个错误的测试用例

    (假设在这种情况下,表 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
    

    【讨论】:

    • 如果产品表有问题,为什么错误是指AST?
    • @AlexPoole 是的,你说得对,Alex,谢谢。我当时怀疑,但我错过了那部分,因为PLS-00201 +1 的解释中的全大写'AST'
    • 谢谢大家。但仍然收到错误。我在 ARCH scema 中创建了类型并在 INV_TEMP scema 中执行了包。类型创建:创建或替换类型 ARCH.AST 作为 varchar2(100) 的 VARRAY(255);创建或替换包 ABC 函数 F_PRODUCT_NAME(P_ATTRIBUTE_UA_NAME IN PRODUCT.Attribute_Ua_Name%TYPE) 返回 ARCH.AST;结束ABC;
    【解决方案2】:

    假设您确实在与表和包相同的架构中创建了类型,那么您所拥有的一切正常;

    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 对象变量或创建对象作为查询。

    【讨论】:

    • 我在同一架构 (ARCH) 中创建了一个包和表,并且在不同架构 (INV_TEMP) 中创建了类型。
    • @DeepakPatil - 好的,那么函数返回应该是RETURN INV_TEMP.AST。但作为该用户,您可能还需要grant execute on AST to ARCH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多