25 de enero de 2015

C# - Oracle: Refcursor y DataReader

Lo primero sera definir la tabla BLOGTABLE que se utilizara, esta almacenara informacion referente de un empleado en tres campos de tipo varchar2 tal como se muestra:


Ahora muestro el formulario que se utilizara para pedir al usuario el código de empleado que se buscara, en este mismo formulario se presentaran los resultados de la búsqueda, especifico solo dos campos porque el tercero(cargo) es mas de lo mismo


utilizaremos un procedimiento almacenado para la búsqueda

create or replace package pabletoreto
as
 type t_cursor is ref cursor;
 procedure ObtenerCampos(p_ID IN BLOGTABLE.ID%TYPE, cursorObtener out t_cursor);

end pabletoreto;


create or replace package body pabletoreto
as
PROCEDURE ObtenerCampos(p_ID IN BLOGTABLE.ID%TYPE, cursorObtener out t_cursor)
IS
BEGIN
    OPEN cursorObtener FOR
       SELECT ID,NOMBRE,CARGO FROM BLOGTABLE
       WHERE ID = p_ID;
end ObtenerCampos;
end pabletoreto;

 y el código del evento Click del botn Buscar en C#


using (OracleConnection OraConn = Conectar()){
     OracleCommand OraCmd = new OracleCommand();
     OraCmd.Connection = OraConn;
     OraCmd.CommandText = "pabletoreto.ObtenerCampos";
     OraCmd.CommandType = CommandType.StoredProcedure;
     OraCmd.Parameters.Add("p_ID", OracleDbType.Varchar2).Value = txtID.Text;
     OraCmd.Parameters.Add(new OracleParameter("cursorObtener", OracleDbType.RefCursor)).Direction = ParameterDirection.Output;
 
     OracleDataReader dr = OraCmd.ExecuteReader();
           if (dr.HasRows){
                    txtID.Text = Convert.ToString(dr["ID"]);
                    txtNombre.Text = Convert.ToString(dr["NOMBRE"]);
                }}}

Pero si en lugar de utilizar procedimiento almacenado utilizaramos una función que devuelve un Refcursor tendriamos, en primer lugar, que crear la funcion