Expresión Case

Porque no puedo usar el siguiente query en Oracle 8.i al crear un package
SELECT met_cas.cas_suc,
CASE
WHEN met_cas.cas_suc > 0 THEN (SELECT min(par_suc.suc_nom_suc)
FROM par_suc
WHERE par_suc.emp_rut_emp = par_emp.emp_rut_emp and
par_suc.suc_id_suc = met_cas.cas_suc )
ELSE ''
END as caso
FROM met_cas, par_emp
WHERE met_cas.emp_rut_emp = par_emp.emp_rut_emp ;
Siendo que si lo testeo en una ventana sql lo ejecuta sin problemas...
Me da el siguiente error que no lo entiendo.
PLS-00103 Encountered the symbol "CASE" when expecting one on the following (-+ mod null <an identifier> <a double_quoted> delimited - identifier...
Soy nuevo en este ambiente y no puedo resolver este error.
Estoy migrando de Sqlserver 6.5 a oracle y tengo un procedimiento almacenado que tiene varios CASE en el select...
Favor si puedes ayudarme.. Estaría agracedido...

2 respuestas

Respuesta
1
Juan, en Oracle la función CASE dentro de una cláusula SELECT no funciona, el equivalente de esta función para Oracle es DECODE y funciona así:
DECODE(<Campo a evaluar>, valor1, accion1, valor2, accion2,...,...). Para el valor1, entonces tomarás la accion1, para el valor2, la accion2, y así sucesivamente.
Espero esto te sirva para tus propósitos.
Saludos,
Gerardo Gutierrez(DBA)
Caracas, Venezuela
Gerardo, gracias por atender mi pregunta, pero igual me queda la duda.
Estoy utilizando la herramienta PLSQL, y supongo que lo que pruebe en este ambientes es bajo Oracle 8.i
Si ejecuto el query en la SQL Window, ¿Por qué ejecuta el query sin reclamar la sintaxis?
Ahora no se si el DECODE que tú mencionas acepta querys en sus condiciones...
Si sabes algo, me podrías informar de lo contrario muchas gracias por tú ayuda...
Juan Bisama B. Santiago (CHILE)
Al parecer estás utilizando una herramienta que ejecuta código de Transaction SQL (que pertenece a SQL_SERVER), es por ello que en ella si te valida el código. Pero cuando trabajas en SQL*Plus no debido a que para Oracle PL/SQL no existe al CASE dentro de una instrucción SELECT.
Para tu caso lo que hace falta es una unidad de programación PL/SQL, es decir, una función, procedure o package en el cual declares un cursor dentro del cual puedas evaluar campos o variables y según ello decidir ejecutar otros queries o cualquier otra acción que te permita la programación PL/SQL.
Es recomendable que te leas un manual de PL/SQL para verificar cual te es más conveniente. TE adelanto una orientación, las funciones se usan cuando quieres realizar acciones y luego retornar valores; el procedure para ejecutar acciones que no requieras retornar valores; y por ultimo el package que sirve para agrupar grupos de funciones y/o procedures que pertenezcan a un mismo módulo.
Agradecido por tú aclaración, he quedado claro en el concepto. Utilizare esa metodología, que por decir me parece más ordenada para efectos de privilegios y perfiles...
Saludos...
Respuesta
1
No tengo mucha idea de sqlserver pero creo que lo podrías solucionar así:
SELECT met_cas.cas_suc, par_emp.emp_rut_emp
INTO cassuc, rutemp,
FROM met_cas, par_emp
WHERE met_cas.emp_rut_emp = par_emp.emp_rut_emp ;
IF cassuc > 0 THEN
SELECT min(par_suc.suc_nom_suc)
INTO caso
FROM par_suc
WHERE par_suc.emp_rut_emp = rutemp
AND par_suc.suc_id_suc = cassuc
ELSE
caso := null;
END IF;
De todas formas en oracle no existe la sentencia case, existe el Decode(expresion, comparacion1, valor1, comparacion2, valor2,..., comparacionN, valorN, valorotro)
Si expresion = comparacion1 devuelve valor 1
si expresion = comparacion2 devuelve valor 2
si exprexsion no es igual a ninguno devuelve valorotro, si no existe valor otro devuelve null

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas