Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Parámetro de entrada / salida

Estas en el tema de Parámetro de entrada / salida en el foro de Oracle en Foros del Web. Buenos días! Gracias por intentar ayudar :) Mi problema es el siguiente, desde un procedimiento llamo a una función que lo que hace es obtener ...
  #1 (permalink)  
Antiguo 01/09/2010, 03:54
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 14 años, 10 meses
Puntos: 0
Exclamación Parámetro de entrada / salida

Buenos días!

Gracias por intentar ayudar :)

Mi problema es el siguiente, desde un procedimiento llamo a una función que lo que hace es obtener el código de cliente de una persona. Para ellos tengo la siguiente código:

Código:
 FUNCTION obtener_codigo_persona(ppersona in out tpersona)
    RETURN NUMBER IS

   
    e_persona tabla_persona%ROWTYPE;
    
    CURSOR c_persona IS
      SELECT codigo
        FROM tabla_persona
       WHERE nombre = ppersona.nombre
         AND apellido1 = ppersona.apellido1
         AND apellido2 = ppersona.apellido2;

    nret         NUMBER := 0;
    vencontrados NUMBER := 0;
    
    CURSOR c_cliente(v_id_cliente tabla_cliente.id_cliente%TYPE) IS
      SELECT id_cliente
            ,fecha_nacimiento
        FROM tabla_cliente
       WHERE id_cliente = v_id_cliente;
    r_cliente c_cliente%ROWTYPE;
                                                                                                    
  BEGIN
      -- Primero se busca en la tabla de personas
      FOR reg_persona IN c_persona
      LOOP
        -- Se va contando el número de personas encontradas
        vencontrados := vencontrados + 1;
        e_persona.codigo := reg_persona.codigo;
      END LOOP;

      IF vencontrados = 1
      THEN
        -- Si hemos encontrado a la persona de manera unívoca se busca en la tabla de clientes a
        -- partir del ID.
        OPEN c_cliente(e_persona.codigo);
        FETCH c_cliente
          INTO r_cliente;
        IF c_cliente%FOUND
        THEN
          -- Si se ha encontrado el cliente se devuelve su Id.
          ppersona.codigo := r_cliente.id_cliente;
          nret := 0;
        ELSE
          -- En caso contrario de devuelve el error
          nret := 1;
        END IF;
        CLOSE c_cliente;
      ELSE
        -- Si se ha encontrado más de una persona o no se ha encontrado ninguna ERROR
        nret := 1;
      END IF;

    -- Devolvemos el código de error generado.
    RETURN nret;
  END codigo_persona;
Como se observa, la función tiene un parámetro de entrada y salida el cual actualizo para asignarle el código de cliente obtenido.. El código va correctamente, se actualiza bien, el problema es cuando voy a consulta el valor de ‘ppersona.codigo’ desde el procedimiento de llamada, me dice q es null... ¿Qué puede estar pasando? ¿Por qué dentro de la función el parámetro de entrada y salida está actualizado y en el procedimiento q la llama aparece a null?

Muchas gracias!!
  #2 (permalink)  
Antiguo 01/09/2010, 07:27
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: Parámetro de entrada / salida

No será por que la función retorna un NUMBER y tu le estas diciendo que la variable de entrada salida es de tipo tpersona?
Yo diría que en vez de utilizar una función, deberías utilizar un procedimiento que si te respeta la salida por la variable que le digas. Por mi parte, nunca uso variables de IN OUT en funciones.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: entrada, salida
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:04.