繁体   English   中英

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

[英]PLS-00201: identifier 'schema.cursorname' must be declared

我知道这里还有两个完全相同的问题,但是我100%肯定我没有任何类型的权限问题。 该过程可以从查询编辑器中很好地执行,但是由于某种原因,我无法从一个非常简单的ASP.net页面执行此proc。 我应该注意,这是我第一次创建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 ,程序包名称为REJECTS_DATA ,过程名称为GETCURSORS ,则至少需要使用以下命令:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM