Oracle - Problema función en Oracle

 
Vista:
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 24/11/2015 18:06:44
Saludos.
Nuevamente novato Oracle en apuros (Le estoy cogiendo un odio ).
Tengo que resolver un ejercicio en en el que me piden el nombre del cliente (nom_cli en la tabla cliente), la fecha del pedido (fec_ped en la tabla pedido) y el valor del pedido (val_ped en la tabla pedido), del cliente que haya hecho el pedido de más valor.
En mi opinión esto debería resolverse con un procedure, pero el ejercicio me pide que lo haga con una función.
Mi duda viene porque las funciones sólo devuelven un valor y ahí hay tres datos para consultar.
He pensado concatenar todo y retornar un solo valor pero en ese caso no sé que tipo de variable sería la que retorna. Supongo que VARCHAR2.
Intenté esto pero no me funciona:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION fn_valPed
RETURN VARCHAR2
IS var_datos VARCHAR2;
BEGIN
SELECT   'Nombre:  '|| nom_cli ||'  Fecha:  '|| fec_ped || '  Valor:  '|| val_ped
INTO var_datos
FROM cliente
JOIN pedido
ON id_cli = id_cli_ped
ORDER BY val_ped asc limit1;
RETURN var_datos;
END;

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de emanuel

Problema función en Oracle

Publicado por emanuel (3 intervenciones) el 24/11/2015 18:38:27
Tienes que definir un varchar2 de una cierta cantidad de caracteres.

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE OR REPLACE FUNCTION fn_valPed
RETURN VARCHAR2(500)
IS
var_datos VARCHAR2(500);
BEGIN
SELECT   'Nombre:  '|| nom_cli ||'  Fecha:  '|| fec_ped || '  Valor:  '|| val_ped
INTO var_datos
FROM cliente
JOIN pedido
ON id_cli = id_cli_ped
ORDER BY val_ped asc limit1;
RETURN var_datos;
END;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 25/11/2015 00:16:13
Originalmente lo tenía así amigo pero me salía un mensaje que decía que había un "(" unexpected después de varchar.
Voy a probar y les comento. Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 25/11/2015 00:18:34
Mira lo que sale:
1
2
3
4
5
6
7
8
9
Error at line 2: PLS-00103: Encountered the symbol "(" when expecting one of the following:
 . @ % ; is authid as cluster order using external character
   deterministic parallel_enable pipelined aggregate
   result_cache
 
1. CREATE OR REPLACE FUNCTION fn_valPed
2. RETURN VARCHAR2(500)
3. IS
4. var_datos VARCHAR2(500);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 499
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Problema función en Oracle

Publicado por Rafael (328 intervenciones) el 25/11/2015 14:19:06
Prueba asi que te debe de funcionar sin problemas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION fn_valPed
RETURN VARCHAR2
IS
var_datos VARCHAR2(500);
BEGIN
    SELECT   'Nombre:  '|| nom_cli ||'  Fecha:  '|| fec_ped || '  Valor:  '|| val_ped
    INTO var_datos
    FROM cliente
         JOIN pedido
           ON id_cli = id_cli_ped
    ORDER BY val_ped asc limit1;
 
    RETURN var_datos;
END;

Saludos

Pd.: Si te sirve siempre un +1 viene bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 25/11/2015 16:47:05
No lo he probado aùn, me parece (No estoy en ese equipo ahora) que lo puse asì anoche y me dio error de lìnea 6 que es la del concat. Pero no estoy seguro.
Cuando llegue a casa pruebo y les confirmo.
EN todo caso muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema función en Oracle

Publicado por Luis (235 intervenciones) el 25/11/2015 18:09:17
Hola Jhon, la funcion de BD tiene que retornar los 3 datos en una sola llamada?

Saludos Luis.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 25/11/2015 18:12:06
Exacto. Quieren que entregue esos tres valores pero me pidieron que lo haga con una funciòn :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 25/11/2015 21:07:35
Se me ocurre que tal vez hay que convertir fec_ped que es date y val_ped que es number a varchar para poder hacer el concat.
He visto que hay algo llamado to_char pero como no estoy en mi equipo no he podido probarlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 26/11/2015 04:05:15
Gente primero que todo darles las gracias por su atención. Les cuento que encontré parte de la solución "tanteando" la función para hallar el problema.
Ejecuté sólo el select con mi concat sin el resto de la función y falló igual, pro cuando le quité el desc limit1 no me falló, ergo el problema era ahí. Al parecer para limitar la salida a una fila se usa rownumber y no limit. Mi función quedó así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION fn_valPed
RETURN VARCHAR2
IS
var_datos VARCHAR2(500);
BEGIN
SELECT   'Nombre:  '|| nom_cli ||'  Fecha:  '|| fec_ped || '  Valor:  '|| val_ped
INTO var_datos
FROM cliente
JOIN pedido
ON id_cli = id_cli_ped
WHERE ROWNUM = 1
ORDER BY val_ped DESC;
RETURN var_datos;
END;

El problema es que efectivamente me devuelve nombre, fecha y valor... Pero no es el valor más alto (Ni el más bajo) :S
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de emanuel

Problema función en Oracle

Publicado por emanuel (3 intervenciones) el 26/11/2015 04:18:02
1) que valores te debe devolver mas grandes y mas bajos?
Definime eso y hacemos el query para que te devuelva como vos queres
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 26/11/2015 04:47:03
Me debe devolver el nombre del cliente, la fecha y el valor del pedido con el valor más alto (val-ped).
Pero en realidad me está devolviendo siempre la primera fila, use asc o desc.
Creo entender que hay que anidar un select dentro del otro porque primero hace el where y luego lo demás (aahora mismo me saca el valor más alto después de que ya agarró un sólo valor), pero no he podido hacerlo.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jhon

Problema función en Oracle

Publicado por Jhon (11 intervenciones) el 27/11/2015 03:12:36
Bueno amigos, tardé pero lo conseguí (A lo mejor para otros es sencillo pero uno que es novato se queda contento).
La solución no sé si será la más prolija, pero me da el resultado que busco y la comparto por si a alguien le sirve:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION fn_valPed
RETURN VARCHAR2
IS
var_datos VARCHAR2(500);
BEGIN
SELECT   'Nombre:  '|| nom_cli ||'  Fecha:  '|| fec_ped || '  Valor:  '|| val_ped
INTO var_datos
FROM cliente
JOIN pedido
ON id_cli = id_cli_ped and val_ped = (SELECT MAX(val_ped) from pedido);
RETURN var_datos;
END;

Una vez más muchas gracias a todos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar