pl -00201: identifier 'schema.cursorname'必须申报

本文关键字:cursorname 须申报 schema -00201 pl identifier | 更新日期: 2023-09-27 17:53:17

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

下面是我调用过程的代码(只是试图调用它并将结果强制到标签中)

    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";

pl -00201: identifier 'schema.cursorname'必须申报

假设模式名称为X,包名称为REJECTS_DATA,过程名称为GETCURSORS,那么该命令至少需要为

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

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

我们在代码中遇到了同样的问题,并且不得不在c#的过程调用中保留SCHEMA_NAME,即PACKAGE_NAME.PROC_NAME。我们通过在数据库中使用SCHEMA_NAME

创建同义词来解决这个问题