PLS-00201:必须声明标识符“schema.cursorname”

Posted

技术标签:

【中文标题】PLS-00201:必须声明标识符“schema.cursorname”【英文标题】:PLS-00201: identifier 'schema.cursorname' must be declared 【发布时间】:2013-01-15 20:22:25 【问题描述】:

我知道这里还有几个其他问题与完全相同的问题,但我 100% 肯定我没有任何类型的权限问题。该过程在查询编辑器中执行良好,但由于某种原因,我无法从一个非常简单的 ASP.net 页面执行此过程。我应该注意这是我第一次尝试创建 Oracle Proc。

这是我调用 proc 的代码(只是试图调用它并将结果强制放入标签中)

    string oradb = "connection string here";

    OracleConnection conn = new OracleConnection(oradb);

    OracleCommand cmd = new OracleCommand();
    cmd.Connection = conn;
    cmd.CommandText = "x.GETCURSORS";
    cmd.CommandType = CommandType.StoredProcedure;

    OracleParameter ACTNUM = new OracleParameter();
    ACTNUM.OracleDbType = OracleDbType.Decimal;
    ACTNUM.Direction = ParameterDirection.Input;
    ACTNUM.Value ="12345";
    cmd.Parameters.Add(ACTNUM);

    OracleParameter REJECTS_C = new OracleParameter();
    REJECTS_C.OracleDbType = OracleDbType.RefCursor;
    REJECTS_C.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(REJECTS_C);


    try
    
        conn.Open();
        OracleDataReader objReader = cmd.ExecuteReader();
        Label3.Text = objReader.ToString();
    
    catch (Exception ex)
    
        Label3.Text = string.Format("Exception: 0", ex.ToString());

    

包装规格:

PACKAGE "x"."REJECTS_DATA" IS

PROCEDURE "GETCURSORS" (
"ACTNUM" IN NUMBER, 
"REJECTS_C" OUT SYS_REFCURSOR);

 END "REJECTS_DATA";

包体:

PACKAGE BODY "x"."REJECTS_DATA" IS

PROCEDURE "GETCURSORS" (
"ACTNUM" IN NUMBER, 
"REJECTS_C" OUT SYS_REFCURSOR) IS

BEGIN

OPEN REJECTS_C FOR SELECT * FROM x.a
WHERE  x.a.ACCOUNT = ACTNUM;

END "GETCURSORS";

END "REJECTS_DATA";

【问题讨论】:

在包规范和定义中,您使用区分大小写的标识符并使​​用小写的"x" 作为架构名称。在您的 C# 代码中,您没有使用区分大小写的标识符。这仅仅是准备问题的人工制品还是您的实际代码中的问题? 【参考方案1】:

假设架构名称为X,包名称为REJECTS_DATA,过程名称为GETCURSORS,则该命令至少需要为

cmd.CommandText = "x.REJECTS_DATA.GETCURSORS";

如果您实际上在 PL/SQL 中使用区分大小写的标识符(我强烈建议您避免),您还需要在过程名称中使用区分大小写的标识符。

【讨论】:

x 只是小写,因为我出于发布目的编辑了表名。添加包名称有效。哎呀,这很简单。【参考方案2】:

我们在代码中遇到了同样的问题,不得不将 SCHEMA_NAME 排除在 C# 中的 proc 调用之外,即 PACKAGE_NAME.PROC_NAME。我们通过使用 SCHEMA_NAME 在数据库中创建同义词解决了这个问题

【讨论】:

以上是关于PLS-00201:必须声明标识符“schema.cursorname”的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00201 标识符必须声明为引用用户定义类型为 SYS

PLS-00201:必须声明标识符“ISDATE”

必须声明错误 PLS-00201 标识符

PL SQL,错误(32,43):PLS-00201:必须声明标识符“HR”

PLS-00201:必须声明标识符“TYPE”

Oracle TYPE 声明抛出错误 PLS-00201 - 必须声明标识符