【问题标题】:"pls-00201 identifier must be declared" in ASP.NET/C#ASP.NET/C# 中的“必须声明 pls-00201 标识符”
【发布时间】:2013-09-08 05:59:06
【问题描述】:

我想在 C#/.NET 中使用以下存储过程:

CREATE OR REPLACE
procedure contact_return(
    v_urn IN VARCHAR2,
    p_cursor OUT SYS_REFCURSOR )
AS
  sql_statement VARCHAR2(4000) := '        

  SELECT URN,
    FIRSTNAME,
    LASTNAME,
    TITLE,
    MOBILE,
    WORK,
    EMAIL
  FROM CONTACT
  WHERE urn = NVL(:1,v_contact_urn)';
BEGIN
  OPEN p_cursor FOR sql_statement USING v_urn;

使用此代码,我收到错误:PLS-00201: identifier 'CONTACT_RETURN' must be declared

        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "contact_return";
        cmd.Parameters.Add("v_urn", OracleDbType.Int64).Value = null;
        cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

据我所知,我已正确声明了存储过程 ('contact_return'),因此无法弄清楚为什么会出现此错误。

任何帮助将不胜感激,谢谢:)

【问题讨论】:

    标签: c# asp.net oracle stored-procedures


    【解决方案1】:

    要调用包含SYS_REFCURSOR 类型的OUT 参数的Oracle 存储过程,您需要使用ODP.NET
    模板解决方案是这样的:

    using Oracle.DataAccess;
    using Oracle.DataAccess.Client;
    
    public DataTable Call_contact_return(string v_urn_value)
                {
                    using (OracleConnection cn = new OracleConnection(DatabaseHelper.GetConnectionString()))
                    {
                        OracleDataAdapter da = new OracleDataAdapter();
                        OracleCommand cmd = new OracleCommand();
                        cmd.Connection = cn;
                        cmd.InitialLONGFetchSize = 1000;
                        cmd.CommandText = DatabaseHelper.GetDBOwner() + "contact_return";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("v_urn", OracleDbType.Char).Value = v_urn_value;                    
                        cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
    
                        da.SelectCommand = cmd;
                        DataTable dt = new DataTable();
                        da.Fill(dt);
                        return dt;
                    }
                }
    

    【讨论】:

      【解决方案2】:

      不应该这样

      CREATE OR REPLACE
      procedure contact_return(
          v_urn IN VARCHAR2,
          p_cursor OUT SYS_REFCURSOR )
      AS
        sql_statement VARCHAR2(4000) := '        
      
        SELECT URN,
          FIRSTNAME,
          LASTNAME,
          TITLE,
          MOBILE,
          WORK,
          EMAIL
        FROM CONTACT
        WHERE urn = NVL(:1,v_contact_urn)';
      BEGIN
        OPEN p_cursor FOR sql_statement USING v_urn;
      

      CREATE OR REPLACE
      procedure contact_return(
          v_urn IN VARCHAR2,
          p_cursor OUT SYS_REFCURSOR )
      AS
      BEGIN
        DECLARE sql_statement VARCHAR2(4000) := '';        
      
        SELECT URN,
          FIRSTNAME,
          LASTNAME,
          TITLE,
          MOBILE,
          WORK,
          EMAIL
        FROM CONTACT
        WHERE urn = NVL(:1,v_contact_urn)';
      
        OPEN p_cursor FOR sql_statement USING v_urn;
      
      END;
      

      【讨论】:

      • 非常感谢,我刚刚尝试过这个(但删除了声明行中的 ';,不确定我是否应该这样做)但不幸的是仍然遇到同样的错误
      • 你能创建程序吗?如果没有,您是否尝试显示错误命令来检查错误?
      • 程序创建时没有任何错误:) 不幸的是,我得到的唯一错误是 C#
      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 2021-12-22
      • 2016-07-25
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多