¿Llamar al procedimiento almacenado de Oracle desde C #?

Acabo de empezar a leer sobre procedimientos almacenados. ¿Alguien puede ayudarme a llamar un procedimiento almacenado en Oracle desde C #?

Visite este sitio ODP configurado por Oracle para desarrolladores de Microsoft OracleClient: http://www.oracle.com/technetwork/topics/dotnet/index-085703.html

También a continuación se muestra un código de muestra que puede comenzar a invocar un procedimiento almacenado desde C # a Oracle. PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT es el procedimiento almacenado creado en Oracle que acepta los parámetros PUNIT, POFFICE, PRECEIPT_NBR y devuelve el resultado en T_CURSOR.

using Oracle.DataAccess; using Oracle.DataAccess.Client; public DataTable GetHeader_BySproc(string unit, string office, string receiptno) { 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() + "PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("PUNIT", OracleDbType.Char).Value = unit; cmd.Parameters.Add("POFFICE", OracleDbType.Char).Value = office; cmd.Parameters.Add("PRECEIPT_NBR", OracleDbType.Int32).Value = receiptno; cmd.Parameters.Add("T_CURSOR", OracleDbType.RefCursor).Direction = ParameterDirection.Output; da.SelectCommand = cmd; DataTable dt = new DataTable(); da.Fill(dt); return dt; } } 

Ahora tengo los pasos necesarios para llamar al procedimiento desde C #

  //GIVE PROCEDURE NAME cmd = new OracleCommand("PROCEDURE_NAME", con); cmd.CommandType = CommandType.StoredProcedure; //ASSIGN PARAMETERS TO BE PASSED cmd.Parameters.Add("PARAM1",OracleDbType.Varchar2).Value = VAL1; cmd.Parameters.Add("PARAM2",OracleDbType.Varchar2).Value = VAL2; //THIS PARAMETER MAY BE USED TO RETURN RESULT OF PROCEDURE CALL cmd.Parameters.Add("vSUCCESS", OracleDbType.Varchar2, 1); cmd.Parameters["vSUCCESS"].Direction = ParameterDirection.Output; //USE THIS PARAMETER CASE CURSOR IS RETURNED FROM PROCEDURE cmd.Parameters.Add("vCHASSIS_RESULT",OracleDbType.RefCursor,ParameterDirection.InputOutput); //CALL PROCEDURE con.Open(); OracleDataAdapter da = new OracleDataAdapter(cmd); cmd.ExecuteNonQuery(); //RETURN VALUE if (cmd.Parameters["vSUCCESS"].Value.ToString().Equals("T")) { //YOUR CODE } //OR //IN CASE CURSOR IS TO BE USED, STORE IT IN DATATABLE con.Open(); OracleDataAdapter da = new OracleDataAdapter(cmd); da.Fill(dt); 

Espero que esto ayude

Básicamente es el mismo mecanismo que para un comando sin consulta con:

  • command.CommandText = el nombre del procedimiento almacenado
  • command.CommandType = CommandType.StoredProcedure
  • Como muchas llamadas a command.Parameters.Add como la cantidad de parámetros que sp requiere
  • command.ExecuteNonQuery

Hay muchos ejemplos, el primero devuelto por Google es este

También hay una pequeña trampa en la que puede caer, si su SP es una función, su parámetro de valor de retorno debe ser el primero en la colección de parámetros

Este código funciona bien para mí llamando al procedimiento almacenado de Oracle

Agregue referencias haciendo clic derecho en el nombre de su proyecto en el explorador de soluciones> Agregar referencia> .Net y luego agregue espacios de nombres.

 using System.Data.OracleClient; using System.Data; 

luego pegue este código en el evento Handler

  string str = "User ID=username;Password=password;Data Source=Test"; OracleConnection conn = new OracleConnection(str); OracleCommand cmd = new OracleCommand("stored_procedure_name", conn); cmd.CommandType = CommandType.StoredProcedure; --Ad parameter list-- cmd.Parameters.Add("parameter_name", "varchar2").Value = value; .... conn.Open(); cmd.ExecuteNonQuery(); 

Y está listo … Feliz encoding con C #

En .Net a través de la versión 4, esto se puede hacer de la misma manera que para los procesos almacenados de SQL Server, pero tenga en cuenta que necesita:

 using System.Data.OracleClient; 

Aquí hay algunos requisitos del sistema que debe verificar están correctos en su escenario.

Microsoft está desaprobando este espacio de nombres a partir de .Net 4 por lo que se necesitarán proveedores externos en el futuro. Con esto en mente, es mejor utilizar Oracle Data Provider para .Net (ODP.NET) desde el principio: esto tiene optimizaciones que no están en las clases de Microsoft. Existen otras opciones de terceros, pero Oracle tiene un gran interés en mantener a los desarrolladores de .Net a bordo, por lo que el suyo debería ser bueno.

Conectarse a Oracle es feo. Aquí hay algo más limpio con el uso. Muchas de las otras muestras no llaman a los métodos IDisposable en los objetos que crean.

  using (OracleConnection connection = new OracleConnection("ConnectionString")) using (OracleCommand command = new OracleCommand("ProcName", connection)) { command.CommandType = CommandType.StoredProcedure; command.Parameters.Add("ParameterName", OracleDbType.Varchar2).Value = "Your Data Here"; command.Parameters.Add("SomeOutVar", OracleDbType.Varchar2, 120); command.Parameters["return_out"].Direction = ParameterDirection.Output; command.Parameters.Add("SomeOutVar1", OracleDbType.Varchar2, 120); command.Parameters["return_out2"].Direction = ParameterDirection.Output; connection.Open(); command.ExecuteNonQuery(); string SomeOutVar = command.Parameters["SomeOutVar"].Value.ToString(); string SomeOutVar1 = command.Parameters["SomeOutVar1"].Value.ToString(); }