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

ERROR ORA-00905: falta una palabra clave

Estas en el tema de ERROR ORA-00905: falta una palabra clave en el foro de Oracle en Foros del Web. Hola a Todos en FDW, necesito una ayudita con una consulta, es una consulta sencilla pero estoy tratando de implementar un CASE dentro de la ...
  #1 (permalink)  
Antiguo 09/06/2014, 11:08
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 1 mes
Puntos: 19
ERROR ORA-00905: falta una palabra clave

Hola a Todos en FDW, necesito una ayudita con una consulta, es una consulta sencilla pero estoy tratando de implementar un CASE dentro de la clausula WHERE y me esta generando el Error ORA-00905 el cual no logro detectar.

Código SQL:
Ver original
  1. SELECT C_Invoice.C_Invoice_ID,NULL,C_Invoice.DocumentNo,C_Invoice.IsActive,XX_NRO_COMPROBANTE,XX_NRO_COMPROBANTEISLR
  2. FROM C_Invoice
  3. WHERE C_Invoice.DocumentNo IS NOT NULL  
  4. AND C_Invoice.IsSoTrx='N' AND C_Invoice.AD_Client_ID IN (0,1000000)
  5. AND C_Invoice.DocStatus IN ('VO','RE') AND CASE '1' WHEN '1' THEN XX_NRO_COMPROBANTE IS NOT NULL AND XX_NRO_COMPROBANTE <> ' '
  6. WHEN '2' THEN XX_NRO_COMPROBANTEISLR IS NOT NULL AND XX_NRO_COMPROBANTEISLR <> ' ' END)
  7. ORDER BY C_Invoice.DocumentNo DESC

Código ERROR:
Ver original
  1. [Error] Líneas de script: 1-7
  2.  ORA-00905: falta una palabra clave
  3.  Línea de script 5, línea de instrucción 5, columna 86

La columna 86 comienza desde aquí IS NOT NULL AND XX_NRO_COMPROBANTE <> ' '

de verdad que no detecto el error, por eso vengo al foro para ver si a alguien más le ha pasado y me puede ayudar.

Saludos.
  #2 (permalink)  
Antiguo 10/06/2014, 07:28
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ERROR ORA-00905: falta una palabra clave

Hola jlct

Como primer error, veo un parentesis perdido END)

No te recomiendo quitarlo, sino mas bien, poner uno al inicio del CASE. AND (CASE '1'

Por otro lado, estas haciendo un mal uso de la sentencia CASE. Fijate que posterior a la clausula THEN va un valor que deseas mostrar, y no una condición mas. Las condiciones van posterior a la clausula WHEN. No tiene sentido decir CASE '1' WHEN '1' THEN...

Dinos que tratas de hacer y te vamos orientando un poco de como realizarlo.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 10/06/2014, 07:49
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 1 mes
Puntos: 19
Respuesta: ERROR ORA-00905: falta una palabra clave

Gracias por responder huesos52, bueno lo del paréntesis se me escapo al agregar el SQL al tema, luego que seguí intentando note que me hacia falta, y el CASE '1' lo coloque como referencia, pero en realidad ese '1' sera una variable que usare de la aplicación donde quiero implementar esa sentencia, olvide mencionar eso disculpen.

Comento este error porque ejecuto este SQL en PostgreSQL y me funciona a la perfección, pero al momento de querer implementarlo en Oracle, ahí me mando ese error.
  #4 (permalink)  
Antiguo 10/06/2014, 08:15
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ERROR ORA-00905: falta una palabra clave

Jlct, te agradezco si pones la consulta como es.
de lo contrario quedamos ciegos de donde puede presentarse el error.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 10/06/2014, 08:34
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 1 mes
Puntos: 19
Respuesta: ERROR ORA-00905: falta una palabra clave

La Consulta como esta actualmente es así:

Código SQL:
Ver original
  1. SELECT C_Invoice.C_Invoice_ID,NULL,C_Invoice.DocumentNo,C_Invoice.IsActive,XX_NRO_COMPROBANTE,XX_NRO_COMPROBANTEISLR
  2. FROM C_Invoice
  3. WHERE C_Invoice.DocumentNo IS NOT NULL  
  4. AND C_Invoice.IsSoTrx='N' AND C_Invoice.AD_Client_ID IN (0,1000000)
  5. AND C_Invoice.DocStatus IN ('VO','RE') AND (CASE '@XX_TipoRetencion@' WHEN 'IV' THEN XX_NRO_COMPROBANTE IS NOT NULL AND XX_NRO_COMPROBANTE <> ' '
  6. WHEN 'IS' THEN XX_NRO_COMPROBANTEISLR IS NOT NULL AND XX_NRO_COMPROBANTEISLR <> ' ' END)
  7. ORDER BY C_Invoice.DocumentNo DESC

Donde @XX_TipoRetencion@ es mi variable el cual puede tener como valor IV o IS

El case esta construido de esa manera ya que la tabla posee las columnas XX_Nro_Comprobante y XX_Nro_ComprobanteISLR pero no necesariamente ambos tienen valores, por eso el motivo de usar el CASE para mostrar las columnas por las que se quiere filtrar.

Espero me haya dado a entender.

Saludos
  #6 (permalink)  
Antiguo 10/06/2014, 08:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ERROR ORA-00905: falta una palabra clave

Cita:
Comento este error porque ejecuto este SQL en PostgreSQL y me funciona a la perfección, pero al momento de querer implementarlo en Oracle, ahí me mando ese error.
Perdón, pero, ¿no se te ocurrió pensar, entonces, que las sintaxis del CASE no son compatibles entre Oracle y PostgreSQL.
No te olvides que salvo el ANSI SQL, cada DBMS implementa el resto de las cosas como quiere. Que dos cláusulas existan en diferentes DBMS, no quiere decir que se escriban o se usen del mismo modo.
Para ver cómo se usa en Oracle, mi consejo es que veas el manual de referencia de Oracle:
http://docs.oracle.com/cd/B19306_01/...essions004.htm
http://docs.oracle.com/cd/B19306_01/...ent.htm#i36967
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 10/06/2014, 12:01
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: ERROR ORA-00905: falta una palabra clave

Ademas, el uso de la @ en variables me suena mas a sql server y no a postgresql.
La sentencia tal como la tienes sin el @ creería que funciona bien tanto en postgresql y oracle.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 10/06/2014, 12:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: ERROR ORA-00905: falta una palabra clave

Limpiando un poco la sintaxis de esa query tenemos:
Código SQL:
Ver original
  1. SELECT   C_Invoice.C_Invoice_ID, NULL, C_Invoice.DocumentNo, C_Invoice.IsActive, XX_NRO_COMPROBANTE, XX_NRO_COMPROBANTEISLR
  2.     FROM C_Invoice
  3.    WHERE C_Invoice.DocumentNo IS NOT NULL
  4.      AND C_Invoice.IsSoTrx = 'N'
  5.      AND C_Invoice.AD_Client_ID IN (0, 1000000)
  6.      AND C_Invoice.DocStatus IN ('VO', 'RE')
  7.      AND (CASE '@XX_TipoRetencion@'
  8.               WHEN 'IV'
  9.                   THEN     XX_NRO_COMPROBANTE IS NOT NULL
  10.                        AND XX_NRO_COMPROBANTE <> ' '
  11.               WHEN 'IS'
  12.                   THEN     XX_NRO_COMPROBANTEISLR IS NOT NULL
  13.                        AND XX_NRO_COMPROBANTEISLR <> ' '
  14.           END
  15.          )
  16. ORDER BY C_Invoice.DocumentNo DESC
Ahora bien, dentro de Oracle, a mi entender (que me corrijan los que tienen más experiencia), no tiene sentido usar CASE en el WHERE porque sólo aplica:
1) En PL/SQL, como controladore de flujo del programa PL, para ejecutar una sentencia en una alternativa.
2) En una sentencia, para devolver un valor a una columna, si el resultado de la comparación (booleano) es TRUE o FALSE.

Ninguna de esas premisas se cumple en ese caso.

Me parece que lo que quieres lograr en Oracle se hace de otras formas. TYal vez lo que quieras sea algo como lo que se realiza con la cláusula WITH, por ejemplo.
De lo contrario, te recomiendo leer algo de selects condicionales, en Oracle. Tal vez te ayude.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 10/06/2014, 13:02
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 1 mes
Puntos: 19
Respuesta: ERROR ORA-00905: falta una palabra clave

Gracias por responder, despues de tanto indagar y leer busque otra alternativa para poder obtener el resultado deseado, pero antes voy a tratar de explicar lo que quise obtener con la consulta anterior.

Este es el query anterior:

Código SQL:
Ver original
  1. SELECT   C_Invoice.C_Invoice_ID, NULL, C_Invoice.DocumentNo, C_Invoice.IsActive, XX_NRO_COMPROBANTE, XX_NRO_COMPROBANTEISLR
  2.     FROM C_Invoice
  3.    WHERE C_Invoice.DocumentNo IS NOT NULL
  4.      AND C_Invoice.IsSoTrx = 'N'
  5.      AND C_Invoice.AD_Client_ID IN (0, 1000000)
  6.      AND C_Invoice.DocStatus IN ('VO', 'RE')
  7.      AND (CASE '@XX_TipoRetencion@'
  8.               WHEN 'IV'
  9.                   THEN     XX_NRO_COMPROBANTE IS NOT NULL
  10.                        AND XX_NRO_COMPROBANTE <> ' '
  11.               WHEN 'IS'
  12.                   THEN     XX_NRO_COMPROBANTEISLR IS NOT NULL
  13.                        AND XX_NRO_COMPROBANTEISLR <> ' '
  14.           END
  15.          )
  16. ORDER BY C_Invoice.DocumentNo DESC

Con esto lo que quería que hiciera es que cuando el valor de mi variable @XX_TipoRetencion@ fuese IV en la clausula WHERE tomara como condición lo siguiente XX_NRO_COMPROBANTE IS NOT NULL AND XX_NRO_COMPROBANTE <> ' ' en caso contrario tomara este XX_NRO_COMPROBANTEISLR IS NOT NULL AND XX_NRO_COMPROBANTEISLR <> ' ', como no lo pude obtener así como en el PostgreSQL realice otro método donde si me funcionó.

El query es el siguiente:

Código SQL:
Ver original
  1. SELECT   C_Invoice.C_Invoice_ID, NULL, C_Invoice.DocumentNo, C_Invoice.IsActive, XX_NRO_COMPROBANTE, XX_NRO_COMPROBANTEISLR
  2.     FROM C_Invoice
  3.    WHERE C_Invoice.DocumentNo IS NOT NULL
  4.      AND C_Invoice.IsSoTrx = 'N'
  5.      AND C_Invoice.AD_Client_ID IN (0, 1000000)
  6.      AND C_Invoice.DocStatus IN ('VO', 'RE')
  7.      AND (
  8.             ('@XX_TipoRetencion@'='IV' AND XX_NRO_COMPROBANTE IS NOT NULL AND XX_NRO_COMPROBANTE <> ' ')
  9.             OR
  10.             ('@XX_TipoRetencion@'='IS' AND XX_NRO_COMPROBANTEISLR IS NOT NULL AND XX_NRO_COMPROBANTEISLR <> ' ')
  11.          )
  12. ORDER BY C_Invoice.DocumentNo DESC

Estoy agradecido por la ayuda y el interes sobre este tema.

Saludos.

Etiquetas: case, sql, sql-sentencia
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 05:27.