23 de enero de 2015

C# - Oracle: Funciones

Se utilizara la conexión a la tabla BLOGTABLE en la base de datos lingonet que se trabajo en esta entrada.

Vamos a crear una función que devuelva el numero de filas de la tabla BLOGTABLE que cumplan con un requisito especificado por el usuario, el requisito lo tomeremos de un textbox desde un formulario y el resultado de las filas lo mostraremos en un label dentro del mismo formulario.

Funcion Oracle

create or replace package pabletoreto
as
function TotalRegistros(id varchar2)RETURN number;

end pabletoreto;

create or replace package body pabletoreto
as
function TotalRegistros(valor varchar2)
return number
is
registros number;
begin
select count(*) into registros from BLOGTABLE where ID  = valor;
return registros;
end;
end pabletoreto;

Ahora antes de ejecutarlo desde C# lo vamos a probar con un bloque anonimo asi:

declare
total NUMBER;
parametro VARCHAR2(10);
begin
parametro := '0909';
total:= pabletoreto.TotalRegistros (parametro);
DBMS_OUTPUT.put_line(total);
EXCEPTION
  WHEN OTHERS
    THEN
      DBMS_OUTPUT.put_line(SQLERRM);
end;

Una vez nos aseguramos que todo va bien, creamos el codigo para invocar la funcion y obtener el resultado desde C#

  private void btxBuscar_Click(object sender, EventArgs e){
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = Conectar();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "pabletoreto.TotalRegistros";
            cmd.BindByName = true;
 string termino = Convert.ToString(txtID.Text.Trim());
 cmd.Parameters.Add(new OracleParameter("valor", OracleDbType.Varchar2)).Value = termino;
 cmd.Parameters.Add("total", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue;
        try{
            cmd.ExecuteNonQuery();
            string resultado = (cmd.Parameters["total"].Value).ToString();
            label1.Text = "resultados encontrados:  " + resultado;
            
             }
        catch (Exception ex){ MessageBox.Show(ex.Message); }
            cmd.Connection.Close();
        }