Ver Mensaje Individual
  #8 (permalink)  
Antiguo 10/06/2014, 12:13
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
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)