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

ayuda URGENTE!!!! POR FA

Estas en el tema de ayuda URGENTE!!!! POR FA en el foro de Oracle en Foros del Web. vereis tengo este ejercicio y no consigo depurarlo dice as: diseñar una funcion llamada da_medico k dado el cod paciente devuelva el nombre de algun ...
  #1 (permalink)  
Antiguo 23/03/2010, 09:09
 
Fecha de Ingreso: marzo-2010
Mensajes: 2
Antigüedad: 14 años, 1 mes
Puntos: 0
ayuda URGENTE!!!! POR FA

vereis tengo este ejercicio y no consigo depurarlo dice as:

diseñar una funcion llamada da_medico k dado el cod paciente devuelva el nombre de algun medico k lo visito, si no tiene visitas devolvera sin medico y en caso de no encontrarse devolvera no hay paciente no utilizar cursores explicitos


tengo esto

CREATE OR REPLACE FUNCTION DA_MEDICO(CODP IN VISITAS.P#%TYPE,
MED IN OUT MEDICOS.NOMBRE%TYPE)
RETURN VARCHAR
IS
MED2 MEDICOS.NOMBRE%TYPE;
BEGIN
SELECT NOMBRE INTO MED2 FROM MEDICOS WHERE M# IN(SELECT M# FROM VISITAS WHERE P#=CODP);
MED:=MED2;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO HAY PACIENTE');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SIN MEDICO');
END;
/

DECLARE
ME MEDICOS.NOMBRE%TYPE;
BEGIN
DA_MEDICO('&CODP',ME);
DBMS_OUTPUT.PUT_LINE(ME.NOMBRE);
END;
/

k esta mal¿?¿

gracias
  #2 (permalink)  
Antiguo 24/03/2010, 11:28
Avatar de 8vio  
Fecha de Ingreso: marzo-2008
Ubicación: Detras del monitor
Mensajes: 168
Antigüedad: 16 años
Puntos: 6
Respuesta: ayuda URGENTE!!!! POR FA

Hola como estas,

Para comenzar esto esta malo.
MED IN OUT MEDICOS.NOMBRE%TYPE
Tienes dos parametros de entrada? El de salida es nada mas el del return. Ahora ese IN OUT te da un error y OUT solo igual.

Seguimos:

Código:
CREATE OR REPLACE FUNCTION DA_MEDICO(CODP IN VISITAS.P#%TYPE)
RETURN VARCHAR
IS

MED MEDICOS.NOMBRE%TYPE;

BEGIN


SELECT NOMBRE 
INTO MED 
FROM MEDICOS 
WHERE M# IN(SELECT max(M#) FROM VISITAS WHERE P#=CODP);

RETURN MED;

EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN('NO HAY PACIENTE');
WHEN OTHERS THEN
RETURN('NO HAY PACIENTE');
END;

Esto estaria correcto, pero creo que la logica del problema no, xq dices que si no tiene visitas no hay medico, y si no existe no hay paciente. Tal vez hace falta una tabla pacientes, Xq siempre que no tenga visitas te va a ir al no datafound, es decir que si no tienes visitas es como si no existiera. Si tuvieras una tabla pacientes podrias verficar asi:

Existe en empleado + no tiene visitas = no hay medico
No existe en empleado = no hay paciente
Se cumplen las dos = se retorna el medico

Falta arquitectura para que te devuelva todo tal cual la logica del negocio y estoy casi seguro que te comiste en la explicacion o en la funcion esa tabla paciente.


Quedaria asi:

Código:
CREATE OR REPLACE FUNCTION DA_MEDICO(CODP IN VISITAS.P#%TYPE)
RETURN VARCHAR
IS

MED MEDICOS.NOMBRE%TYPE;
PACIE NUMBER;

BEGIN

SELECT COUNT(P#) 
INTO PACIE
FROM PACIENTE
WHERE P#=CODP;

IF (PACIE>0) THEN

SELECT NOMBRE 
INTO MED 
FROM MEDICOS 
WHERE M# IN(SELECT max(M#) FROM VISITAS WHERE P#=CODP);

ELSE

MED:= 'NO HAY PACIENTE';

END IF;

RETURN MED;

EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN('NO HAY MEDICO');
WHEN OTHERS THEN
RETURN('NO HAY MEDICO');
END;
De esta ultima forma estaria correcto con logica y todo

Nota: En el select del medico en las visitas coloque un max(), xq me va a traer un monton de medicos y va a explotar ( si tiene varios). El criterio para seleccionar el medico lo puedes cambiar, por ejm si tienes fechas en esa tabla visita agarras el ultimo medico de la ultima visita. Ojo el max no hace eso.

Saludos,

Última edición por 8vio; 24/03/2010 a las 12:08 Razón: Nota

Etiquetas: Ninguno
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 19:32.