Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/09/2010, 03:54
MaCaRo1
 
Fecha de Ingreso: mayo-2009
Mensajes: 12
Antigüedad: 15 años, 6 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!!