| |||
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? |
| |||
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 |
| |||
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. |
| |||
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? |
| |||
***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. |
| |||
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? |