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

ordenar resultado del SELECT de acuerdo a parametro del STORED PROC

Estas en el tema de ordenar resultado del SELECT de acuerdo a parametro del STORED PROC en el foro de Oracle en Foros del Web. Holas. Quisiera saber si es posible, de acuerdo a algún parámetro ingresado a un stored procedure, ordenar el resultado de un SELECT. Es decir, d ...
  #1 (permalink)  
Antiguo 12/05/2006, 11:56
k3n
 
Fecha de Ingreso: marzo-2006
Mensajes: 56
Antigüedad: 18 años, 8 meses
Puntos: 0
ordenar resultado del SELECT de acuerdo a parametro del STORED PROC

Holas. Quisiera saber si es posible, de acuerdo a algún parámetro ingresado a un stored procedure, ordenar el resultado de un SELECT. Es decir, d acuerdo a un valor 1, por ejemplo, el ORDER BY sea por el campo1. Si se ingresa el valor 2, el ORDER BY sea por el campo 2. He inentado hacerlo con un if, pero me sale error. Luego por ahí vi que usaban un CASE en un select, pero tampoco he podido hacerlo funcionar para el ORDER BY. ¿Se puede hacer o tengo que hacer todo un SELECT nuevo para cada ORDER BY distinto?
  #2 (permalink)  
Antiguo 12/05/2006, 14:08
 
Fecha de Ingreso: noviembre-2005
Mensajes: 658
Antigüedad: 19 años
Puntos: 3
hazlo asi :

CREATE PROCEDURE prueba
@opcion tinyint = 0
AS
SELECT campo1,campo2,campo3
FROM Tutable
ORDER BY CASE WHEN @opcion = 1 THEN campo1
WHEN @opcion = 2 THEN campo2
ELSE campo3
END
  #3 (permalink)  
Antiguo 12/05/2006, 14:32
k3n
 
Fecha de Ingreso: marzo-2006
Mensajes: 56
Antigüedad: 18 años, 8 meses
Puntos: 0
Yo uso el PL/SQL.
Hice lo siguiente:

order by case when ord = 0 then g.vdeger
when ord = 1 then x.cnumcnv
else x.dfeini
end;

Me sale el siguiente error:

Compilation errors for PACKAGE BODY WORKFLOW.PKG_ULTIMUS_PENDIENTESPRUEBA

Error: PLS-00103: Encountered the symbol "CASE" when expecting one of the following:

( - + mod null <an identifier>
<a double-quoted delimited-identifier> <a bind variable> avg
count current max min prior sql stddev sum variance execute
forall time timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string>
Line: 39
Text: order by case when ord = 0 then g.vdeger

No sé si algo tenga que ver que este SELECT ya se encuentra dentro de un IF.
  #4 (permalink)  
Antiguo 12/05/2006, 15:04
k3n
 
Fecha de Ingreso: marzo-2006
Mensajes: 56
Antigüedad: 18 años, 8 meses
Puntos: 0
Buscando otra solución

En el PL/SQL se puede hacer lo siguiente:

SELECT campo1, campo2
FROM tabla

ORDER BY 2

Esto me daría ordenado por el campo2. Si usara ORDER BY 1 me lo ordenaría por el campo1. En un procedure estoy definiendo la variable "ord" como number, usandola de esta manera

SELECT campo1, campo2
FROM tabla

ORDER BY ord

En teoría me debería funcionar, pero tampoco trabaja como quisiera. Ya he probado con "'ord'", "ord" y 'ord', pero tampoco me funciona. También usé declarando "ord" como in char, con las comillas anteriores, y tampoco. ¿Alguna sugerencia?
  #5 (permalink)  
Antiguo 12/05/2006, 17:33
 
Fecha de Ingreso: noviembre-2005
Mensajes: 658
Antigüedad: 19 años
Puntos: 3
Pudiste haber especificado el motor que usas.... bueno, en fin.... para Oracle usa DECODE en vez de CASE

ORDER BY DECODE (:ord, '1', campo1,
'2', campo2,
campo3)
  #6 (permalink)  
Antiguo 15/05/2006, 13:11
k3n
 
Fecha de Ingreso: marzo-2006
Mensajes: 56
Antigüedad: 18 años, 8 meses
Puntos: 0
***Si funciona, aunque no exactamente igual (porque sí es un motor Oracle), pero ahora tengo el problema de tener muchos argumentos en el Decode. Máximo me permite 8 campos, y yo tengo 11.
***Sobre el uso directo de la variable "ord" anterior, me dijeron que eso no se puede hacer para el order by. Este no acepta variables de esa manera. Solamente puedo pasarle el nombre o la posición de un campo.
  #7 (permalink)  
Antiguo 15/05/2006, 14:19
k3n
 
Fecha de Ingreso: marzo-2006
Mensajes: 56
Antigüedad: 18 años, 8 meses
Puntos: 0
Ahora ando tratando de usar el case para decidir cuál será mi último campo. Así, en el order by tan sólo pongo en número al úiltimo campo y de acuerdo a esto hará la búsqueda. Me está quedando así

select g.vdeger as GERENCIA, x.CNUMCNV as "No EXPEDIENTE", to_char(x.dfeini,'yyyy/mm/dd hh:mm:ss') as "FECHA DE CREACIÓN", X.VRAZSOC as "RAZON SOCIAL", x.vtxobs as "ASUNTO", U.vappat ||' '|| U.vapmat ||', '|| U.vnousr as "USUARIO", t.name as "TIPO DE EXP.", s.LABEL as ESTACIÓN, s.starttime as "Desde el...", t.incident, A.vdeare as Area,
(case when ord=1 then g.vdeger when ord = 2 then x.cnumcnv when ord = 3 then to_char(x.dfeini,'yyyy/mm/dd hh:mm:ss') end case;)
from LAS TABLAS
order by 13

Esto del case lo he buscado en la net, y teóricmente debería funcionar, pero en la práctica el error me dice que se ha encontrado un CASE en vez de algunos caracteres más, y eso me da a entender que no estoy usándolo de la manera correcta. ¿Alguien ha usado ya el case en PL/SQL y le ha funcionado? ¿Puede publicar su código?
  #8 (permalink)  
Antiguo 15/05/2006, 14:35
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años, 7 meses
Puntos: 3
Estas terminando con : "end case;)" ?. Prueba poniendo solo END y sin ;
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
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 18:21.