【问题标题】:In .NET, How to execute this Oracle PL/SQL Procedure?在 .NET 中,如何执行这个 Oracle PL/SQL 过程?
【发布时间】:2011-09-06 03:30:33
【问题描述】:

我的程序在这里声明:

create or replace
PACKAGE MYPKG
IS
PROCEDURE MYPROCEDURE(
        sNom            IN VARCHAR2,
        sValeur         OUT VARCHAR2,
        sCommentaire    OUT VARCHAR2,
        sRetour         OUT VARCHAR2,
        sMsgRetour      OUT VARCHAR2);
END;

使用 SQL Developer 执行正常。

我尝试在 C# 中执行此过程:

OracleCommand cmd = new OracleCommand("MYPKG.MYPROCEDURE", OraCon);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter name = new OracleParameter("sNom", OracleType.VarChar);
name.Value = "CG";
cmd.Parameters.Add(name);
OracleParameter valeur = new OracleParameter("sValeur", OracleType.VarChar);
cmd.Parameters.Add(valeur);
OracleParameter commentaire = new OracleParameter("sCommentaire", OracleType.VarChar);
cmd.Parameters.Add(commentaire);
OracleParameter retour = new OracleParameter("sRetour", OracleType.VarChar);
cmd.Parameters.Add(retour);
OracleParameter msgRetour = new OracleParameter("sMsgRetour", OracleType.VarChar);
cmd.Parameters.Add(msgRetour);

using (OracleDataReader row = cmd.ExecuteReader())
{
    while (row.Read())
    {
        Console.WriteLine(row.GetValue(0));
    }
}

我有错误“错误的参数”。 PL/SQL过程如何执行?

【问题讨论】:

    标签: c# oracle plsql


    【解决方案1】:

    这就是我的处理方式。
    注意:我已经编译了这段代码,但我没有针对数据库对其进行测试,尽管我有很多类似的代码都可以正常工作。

    另请注意:您没有取回集合,因此您应该真正使用 OraCmd.ExecuteNonQuery 而不是 OraCmd.ExecuteReader

    using System.Configuration;
    using System.Data;
    using Oracle.DataAccess.Client;
    
    
        namespace Testing
        {
            public class OracleCommandTest
            {
    
                string m_strConnectionsString = string.Empty;
    
                //Constructor
                public OracleCommandTest()
                {
                    //Get the connection string from the app.config            
                    m_strConnectionsString = ConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;
    
                    //if it is a web app, then use this call instead
                    //m_strConnectionsString = WebConfigurationManager.ConnectionStrings["ConnectionStringName"].ConnectionString;
    
                }
    
    
    
                public void getData(string sNom, out string sValeur, out string sCommentaire, out string sRetour, out string sMsgRetour)
                {
                    OracleConnection ora_conn = new OracleConnection(m_strConnectionsString);
    
                    try
                    {
                        ora_conn.Open();
    
                        /*********************Oracle Command**********************************************************************/
                        OracleCommand ora_cmd = new OracleCommand("MYPKG.MYPROCEDURE", ora_conn);
                        ora_cmd.BindByName = true;
                        ora_cmd.CommandType = CommandType.StoredProcedure;
    
    
                        ora_cmd.Parameters.Add("sNom", OracleDbType.Varchar2, sNom, ParameterDirection.Input);
                        ora_cmd.Parameters.Add("sValeur", OracleDbType.Varchar2, ParameterDirection.Output);
                        ora_cmd.Parameters.Add("sCommentaire", OracleDbType.Varchar2, ParameterDirection.Output);
                        ora_cmd.Parameters.Add("sRetour", OracleDbType.Varchar2, ParameterDirection.Output);
                        ora_cmd.Parameters.Add("sMsgRetour", OracleDbType.Varchar2, ParameterDirection.Output);
                        /*********************Oracle Command**********************************************************************/
    
                        ora_cmd.ExecuteNonQuery();
    
                        //Now get the values output by the stored procedure    
                        sValeur = ora_cmd.Parameters["sValeur"].Value.ToString();
                        sCommentaire = ora_cmd.Parameters["sCommentaire"].Value.ToString();
                        sRetour = ora_cmd.Parameters["sRetour"].Value.ToString();
                        sMsgRetour = ora_cmd.Parameters["sMsgRetour"].Value.ToString();
    
    
    
    
                    }
    
                    //catch (Exception ex)
                    //{
                    //    WebErrorHandling.WriteToEventLog("PRVEquipment_DAL.getPRVEquipment", ex);
    
                    //}
                    finally
                    {
                        if (ora_conn.State == ConnectionState.Open)
                        {
                            ora_conn.Close();
                        }
                    }
    
                }
    
    
            }
    
    
        }
    

    希望这会有所帮助
    哈维萨瑟

    【讨论】:

      【解决方案2】:

      您忘记为参数设置Direction。

      您必须设置ParameterDirection.Output,因为您希望从存储过程中返回值,否则默认情况下将其视为输入参数,因此错误

      【讨论】:

      • 谢谢,这是问题的一部分(参见其他讨论)。
      【解决方案3】:

      对参数类型使用OracleType 枚举。更多信息here
      您还应该设置参数的Direction。
      Example

      【讨论】:

      • 我设置了方向。现在错误是: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 1 但是我设置了 DbType.String,类型不正确?
      • 当我用 OracleType.VarChar 替换 DbType.String 时出现同样的错误。
      • 最后一个问题来自我必须将 Size 属性设置为 OracleParameter。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2018-07-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      相关资源
      最近更新 更多