none
Ejecutar Paquetes (SP) de Oracle en NET RRS feed

  • Pregunta

  • Saludos, Estoy tratando de obtener un valor scalar muy básico desde oracle (Select Count(*) de una tabla que por supuesto tiene varios registros...).

    He usado varios data providers: System.Data.OracleClient, odp.net.4.0_Oracle11g, odp.net.4.0_Oracle12c, dotConnect for Oracle, etc. y con ninguno me funciona, es simple: Obtener el Select count(*) de una tabla cualquiera pero por medio del procedimiento almacenado de un paquete (OracleCommand.CommandType = CommandType.StoredProcedure)

    Si lo hago directo contra la tabla (OracleCommand.CommandType = CommandType.Text) usando "Select Count(*) from.... si funciona perfecto, el problema es que usando Procedimientos Almacenados (SP) el ExecuteScalar SIEMPRE ME REGRESA UN VALOR NULO. (Y el ExcuteNonQuery() si ejecuta bien las consultas de update o insert o delete, pero siempre regresa -1)

    Este es mi código resumido y explicado, incluyo el PSQL de Oracle para el procedimiento almacenado.

    Agradezco cualquier orientación, Repito: el problema (tanto de ExecuteScalar()  como de ExecuteNonQuery() solo pasa cuando se ejecuta desde un Paquete de Oracle, de resto lo hace bien)

    ' -- Head del Paquete: ' create or replace PACKAGE pr_web_version AS TYPE c_cursor IS REF CURSOR; ' ' -- Hay código de varias declaraciones de otros procedimiento almacenados ' -- pero que no aplican al error indicado ' ' PROCEDURE contar; ' ' END pr_web_version; ' -- CUERPO DEL PAQUETE ' PROCEDURE contar is ' p_salida DECIMAL := 0; ' BEGIN ' SELECT COUNT(*) INTO p_salida FROM EO_USUARIOS_TEMP; ' END contar; Imports System.Data Imports System.Data.OracleClient ' NOTA: Lo he intentando con el cliente por defectos de NET (System.Data.OracleClient) ' y con otros: Oracle.DataAccess.dll del odp.net.4.0_Oracle12c y odp.net.4.0_Oracle11g Dim _oracleConnection As New OracleConnection("connectionString...") Dim _oracleCommand As OracleCommand _oracleCommand = New OracleCommand() With {.Connection = _oracleConnection, .CommandText = "pr_web_version.contar", .CommandType = CommandType.StoredProcedure} _oracleConnection.Open() Dim result As Integer = CInt(_oracleCommand.ExecuteScalar())

    ' Aquí esta el error: ' ---> result SIEMPRE ES NULL


    Gracias por toda la ayuda....


    • Editado Edward Ocando martes, 11 de junio de 2019 21:57 Erro de ortografia...
    martes, 11 de junio de 2019 21:54

Todas las respuestas

  • Hola, prueba estos cambios:

    1.- Modificar tu procedimiento para devolver una variable OUT.

    2.- Hacer la llamada usando ExecuteNonQuery y luego recuperar el valor del parámetro de salida. (Recuerda actualizar la definiciónd el paquete)

     PROCEDURE contar(p_salida out number) is 
     BEGIN
        SELECT COUNT(*) INTO p_salida FROM EO_USUARIOS_TEMP;
     END contar;

    Y el código quedaría

    Using (_oracleConnection As OracleConnection = New OracleConnection("connectionString..."))    
     
    	Dim _oracleCommand As OracleCommand = New OracleCommand() With {.Connection = _oracleConnection, .CommandText = "pr_web_version.contar", .CommandType = CommandType.StoredProcedure}  
    	_oracleCommand.Parameters.Add("p_salida", OracleType.Number).Direction = ParameterDirection.Output
    	   
     
    	_oracleConnection.Open();    
    	_oracleCommand.ExecuteNonQuery();    
    	Dim result As Integer = CInt(_oracleCommand.Parameters["p_salida"].Value)    
    	
    	_oracleConnection.Close();    
    End Using   


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    martes, 11 de junio de 2019 22:46
  • Estimado gracias por su sugerencia, pero ya esas opciones las había probado antes y de verdad  nunca funcionaron.

    Como comente antes el problema es que por alguna razón aparente (usando paquetes y procedimientos almacenados en oracle) el metodo excuteScalar() siempre devuelve un nulo (cuando es CommandType = CommandType.StoredProcedure) 

    En el modo CommandType = CommandType.Text la sentencia Select count(*) from.... si funciona bien (y cualquier otra sentencia que regrese un valor scalar)

    Te pregunto: Pudieras tu simular y ejecutar el código que yo coloque como ejemplo y validar.???

    Gracias..

    jueves, 13 de junio de 2019 17:02
  • Estimado saludos, ya me di por vencido.

    Simplemente no logro poder ejecutar un ExecuteScalar en oracle cuando el comando es ejecutado en un procedimiento almacenado (dentro de un paquete).

    Será posible que a nadie jamas le haya ocurrido ese error...?

    Ya solo me falta hacer brujería y yo no creo en brujos.

    lunes, 17 de junio de 2019 19:48