在.NET中,如何执行这个Oracle PL/SQL过程

本文关键字:Oracle PL 过程 SQL 执行 NET 何执行 | 更新日期: 2023-09-27 17:58:13

我的过程在这里声明:

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过程?

在.NET中,如何执行这个Oracle PL/SQL过程

这就是我处理它的方式。
注意:我已经编译了这段代码,但我还没有在数据库中进行测试,尽管我有很多类似的代码可以很好地工作。

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

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();
                    }
                }
            }

        }

    }

希望这能有所帮助
Harvey Sather

您忘记为参数设置Direction

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

对参数类型使用OracleType枚举。更多信息请点击此处
此外,您还应该设置参数的Direction
示例