none
Error al ejecutar una consulta desde Visual Studio a una Base de datos de Oracle 11g RRS feed

  • Pregunta

  • Hola a todos, estoy intentando leer datos de una tabla (Clientes) de una base de datos Oracle con ADO 2.0 utilizando un procedimiento almacenado (LEECLiENTE) y me encuentro un problema de error de tipo numérico, os pongo la definición de la tabla y , el procedimiento mi acceso desde ADO a ver si veis algo que yo no veo.

    1) La tabla

    CREATE TABLE "JAVIER"."CLIENTES"     ( "ID" NUMBER, "NOMBRE" VARCHAR2(30), "APELLIDOS" VARCHAR2(50 ), 
    "PROVINCIA_ID" NUMBER,  "COMUNIDAD" VARCHAR2(30 )) 

    2) el procedimiento

    create or replace PROCEDURE   LEECLIENTE( C_ID IN CLIENTES.ID%TYPE, C_NOMBRE OUT VARCHAR2, C_APELLIDOS OUT VARCHAR2)
    AS
    BEGIN
       SELECT NOMBRE, APELLIDOS INTO C_NOMBRE, C_APELLIDOS   FROM JAVIER.CLIENTES WHERE ID=C_ID;

    END;

    3) mi llamada desde Visual Studio (la conexión es correcta y con otro procedimiento grabo sin problemas)

                conecta(); //abre la conexión (OCN)
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = OCN;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "JAVIER.LEECLIENTE";
                var p1 = new OracleParameter("ID", OracleDbType.Decimal, ParameterDirection.Input);
                p1.Value = int.Parse(txNom.Text);
                var p2 = new OracleParameter("C_NOMBRE", OracleDbType.Varchar2, ParameterDirection.Output);
                p2.Value = "A";
                var p3 = new OracleParameter("C_APELLIDOS", OracleDbType.Varchar2, ParameterDirection.Output);
                p3.Value = "B";
                cmd.Parameters.Add(p1);
                cmd.Parameters.Add(p2);
                cmd.Parameters.Add(p3);

                cmd.ExecuteNonQuery();
                txNom.Text = cmd.Parameters["C_NOMBRE"].Value.ToString();
                txApe.Text = cmd.Parameters["C_APELLIDOS"].Value.ToString();

    lo que intento con el procedimiento es leer dos parámetros definidos en el procedimiento como de salida, pero al pasar por la línea EXECUTENONQUERY genera siempre una excepción ORA-06502: PL/SQL: error  numérico o de valor, a pesar de que el equivalente de NUMBER en tabla en Oracle es OracleDbType.Decimal pero algo falla, a ver si le encontraís algun error, el procedimiento desde Oracle funciona correctamente.

    un saludo y gracias

    martes, 14 de marzo de 2017 17:42

Respuestas

  • también debes declarar los tamaños a la hora de definir los parámetros varchar
    var p2 = new OracleParameter("C_NOMBRE", OracleDbType.Varchar2, ParameterDirection.Output, 30);
     var p3 = new OracleParameter("C_APELLIDOS", OracleDbType.Varchar2, ParameterDirection.Output, 50);

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

    • Marcado como respuesta fjjcent martes, 14 de marzo de 2017 23:08
    martes, 14 de marzo de 2017 17:57

Todas las respuestas

  • Si has definido los parámetros C_NOMBRE y C_APELLIDOS como de salida (OUT) para qué les estableces un valor? Comenta las líneas en las que estableces el valor "A" y "B" y nos dices qué tal.  

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

    martes, 14 de marzo de 2017 17:49
  • también debes declarar los tamaños a la hora de definir los parámetros varchar
    var p2 = new OracleParameter("C_NOMBRE", OracleDbType.Varchar2, ParameterDirection.Output, 30);
     var p3 = new OracleParameter("C_APELLIDOS", OracleDbType.Varchar2, ParameterDirection.Output, 50);

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

    • Marcado como respuesta fjjcent martes, 14 de marzo de 2017 23:08
    martes, 14 de marzo de 2017 17:57
  • Aunque no he trabajado antes con Oracle, y actualmente trabajo con ADO 4.0 lo cierto es que recuerdo que los parámetros de tipo out que se mandaban con ADO 2 a SQL Server era obligatorio inicializarlos, no tenía sentido pero era obligatorio, por lo que esto no creo que cambie con Oracle, y de hecho ya funciona sin cambiarlo.

    gracias Sergio.

    martes, 14 de marzo de 2017 23:05
  • este cambio si que ha sido efectivo, yo estaba volcado en que el problema eran los datos numéricos y resulta que no que eran los tamaños del varchar, lo he cambiado y ya funciona, el método no tenía tu formula sino la siguiente:

    var p3 = new OracleParameter("C_APELLIDOS", OracleDbType.Varchar2,60,null, ParameterDirection.Output);

    pero si no me lo dices no hubiera caído en ello.

    Gracias de nuevo Sergio.

    martes, 14 de marzo de 2017 23:08