Error de Oracle: PLS-00306: número incorrecto o tipos de argumentos

.net dapper odp.net oracle stored-procedures

Pregunta

Estoy usando Dapper y ODP.Net para llamar a un procedimiento almacenado. Me siento tonto de no encontrar lo que está mal con mis parámetros, pero aquí va:

Aquí está la firma del procedimiento almacenado:

PROCEDURE SP_NETWORK_GETALL(UserLogon IN VARCHAR2, NetworkVersionList OUT refCursor)

Y aquí está mi llamada .Net:

using (var conn = new OracleConnection(connString))
{
    var parameters = new List<OracleParameter>
    {
        new OracleParameter()
        {
            Direction = ParameterDirection.Input,
            ParameterName = "UserLogon",
            OracleDbType = OracleDbType.Varchar2,
            Size = 4000,
            Value = "TEST"
        },
        new OracleParameter()
        {
            Direction = ParameterDirection.Output,
            OracleDbType = OracleDbType.RefCursor,
            ParameterName = "NetworkVersionList",
            Value = DBNull.Value
        },
    };

    var results = conn.Query("SDTM.PKG_SP_GET.SP_NETWORK_GETALL", parameters, commandType: CommandType.StoredProcedure);
}

Probé este procedimiento almacenado, funciona. He usado Dapper para otros procedimientos almacenados, también funciona. Intenté cambiar el orden de los parámetros (el cursor de referencia primero), estableciendo el tamaño del parámetro VarChar2 o no, DBNull.Value para el cursor ref o no.

He visto un millón de preguntas como esta en stackoverflow o en internet, pero no puedo ver la discrepancia de parámetros aquí ...

Respuesta aceptada

El problema es que está enviando una lista de objetos OracleParameter a la variable "parameters" de dapper. Dapper está destinado a ser independiente del proveedor y usted está enviando tipos específicos del proveedor.

Eche un vistazo al método GetCacheInfo en el código dapper y verá tres casos en la forma en que dapper intenta manejar los parámetros:

  1. Un objeto de IDynamicParameters
  2. Un objeto de IEnumerable <KeyValuePair <string, object >>
  3. Default / Else: intente encontrar propiedades en su objeto que coincidan con los tokens en el comando.

Probablemente estés cayendo en el caso predeterminado, pero debido a que tienes un proceso, no hay tokens en el comando y no se agregaron parámetros. Incluso si lo fueran, probablemente estaría buscando a través de las propiedades de tipo List <> y no encontrará una coincidencia.

Agregar IDynamicParameters le permite controlar los parámetros y es por eso que funciona. Esto no tiene nada que ver con odp.net.

Supongo que este es uno de mis problemas con apuesto como con todos los ORM: por más difícil que lo intenten, siempre va a haber cosas específicas del proveedor que no pueden ser abstraídas. Es por eso que prefiero simplemente configurar el comando específico del proveedor y luego usar una clase de utilidad que SÓLO hace la asignación (sin preocuparse por la conexión / configuración / ejecución).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué