error al crear una sentencia SQL en oracle - decode

63 views
Skip to first unread message

Soporte 06

unread,
Mar 14, 2007, 5:57:59 PM3/14/07
to NHibernate-Hispano
Buenas gente,
quería consultarles si han tenido el siguiente problema y si saben
como solucionarlo se los agradezco mucho.

El problema es el siguiente:
Estoy usando NH 1.0.3 con Oracle y cuando ejecuto un HQL me crea una
sentencia SQL con error. Al crear el SQL usa la funcion decode() y no
coloca el primer argumento con lo cual el provider del oracle lanza un
error (ORA: 00936 Falta una expresión)

La sentencia SQL es muy grande para enviarla completa pero paso la
parte con error:
select elementobu0_.IDELEMENTO as IDJERARQ1_,
decode( , "elementobu0__8_".IDMAESTRONEGOCIO , 8,) ....


Gracias!!!

Soporte 06

unread,
Mar 15, 2007, 11:04:59 AM3/15/07
to NHibernate-Hispano
Volví a la versión 1.0.2 y no me dió este error.
La versión 1.0.3 y 1.0.4 de Nh dan este error para ORACLE.
No se está generando correctamente la sentencia SQL cuando utiliza la
función decode()

Dario Quintana

unread,
Mar 15, 2007, 12:06:12 PM3/15/07
to NHibernat...@googlegroups.com
Me parece que vas a tener que copiar entero el error, no ayuda mucho
ese mensaje.


--
Dario Quintana
http://blog.darioquintana.com.ar

Dario Quintana

unread,
Mar 15, 2007, 12:17:59 PM3/15/07
to NHibernat...@googlegroups.com
Ahí me mataste, ni idea :s

Soporte 06

unread,
Mar 16, 2007, 7:53:35 AM3/16/07
to NHibernate-Hispano
Gracias Dario por la respuesta.
Te cuento que lo solucioné regresando a la versión anterior del
Nhibernate (1.0.2) ya que con la verisón 1.0.3 y 1.0.4 no me
funcionó.

A modo de explicación: Si no se entendió cual es el problema, intento
explicarlo nuevamente.
Al querer ejecutar una consulta HQL (Ej: From Alumno alum Where
alum.IdAlumno = 26) en ORACLE, cuando Nhibernate convierte (complila)
esta expresión y crea una equivalente para ejecutar en el motor de BD,


crea una sentencia SQL con error.

Este error se produce cuando utiliza la función decode() de Oracle
(que es una equivalente al case de MsSqlServer) ya que no coloca el
parametro correspondiente a condición. ( sintax: decode(<expresion a
evaluar>, {<valor a comparar>, <valor>}) )
En el ejemplo del Alumno, suponiendo que este herede de Persona, la
sentencia SQL que se ejecutaría en la BD seria algo así:
SELECT Alumno.IdAlumno as idAlum_, decode (Alumno.IdAlumno,
Persona.IdPersona, 2, Alumno.IdAlumno, 1 , 0) as clazz_,
Alumno.Legajo, Pesona.Nombre , Pesona.Apellido, Persona.Dni
>From Alumno, Persona
where Alumno.IdAlumno = Persona.IdPersona
and Alumno.IdAlumno = 26

El error se produce cuando arma "decode (<Aqui debería ir un campo>,
Persona.IdPersona, 2, Alumno.IdAlumno, 1 , 0) as clazz_"

Espero se entienda.

¿Alguien sabe como pasar este error para que sea corregido?

Gracias!!!


On 15 mar, 13:17, "Dario Quintana" <conta...@darioquintana.com.ar>
wrote:


> Ahí me mataste, ni idea :s
>

> Dario Quintanahttp://blog.darioquintana.com.ar- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Fabio Maulo

unread,
Mar 16, 2007, 12:21:12 PM3/16/07
to NHibernat...@googlegroups.com
Soporte 06 escribió:

> ¿Alguien sabe como pasar este error para que sea corregido?
>
Se hace acá
http://jira.nhibernate.org/secure/Dashboard.jspa

Bye.
Fabio.

Fabio Maulo

unread,
Mar 16, 2007, 12:18:26 PM3/16/07
to NHibernat...@googlegroups.com
Soporte 06 escribió:

> Volví a la versión 1.0.2 y no me dió este error.
> La versión 1.0.3 y 1.0.4 de Nh dan este error para ORACLE.
> No se está generando correctamente la sentencia SQL cuando utiliza la
> función decode()
Te cuento...
El HQL parser anterior si encontraba algo que no entendía simplemente lo
dejaba.
Despues de eso varia gente se quejaba porque no era NH a crear una
exception, por error de digitación, si no que era el dataprovider.
Bueno... se actualizó el parser con la versión que estaba en
Hibernate... lastima que fue solo el ClassicParse que no gestionaba
correctamente las HQL function.
Hibernate usa, ahora, un parse mucho mas completo y estable que se basa
sobre ANTLR. Espero el prox mes empezar a estudiarlo para pasarlo a NH.
En este mismo instante estoy mirando si logro modificar el ClassicParse
para manejar correctamente las HQL function.
El problema que tiene es interpretar funciones con mas de un parametro.
Lo feo de todo esto es que el ClassicParse es un verdadero quilombo.

Bueno... si lo logro y Sergey está de acuerdo a publicar las
modificaciones en la prox release, tendrán noticias.

Bye.
Fabio.

Soporte 06

unread,
Mar 16, 2007, 12:54:31 PM3/16/07
to NHibernate-Hispano

Fabio,
No he agregado nunca un error en el proyecto. Ya estoy registrado en
el Proyecto .
¿Agrego este error como un nuevo Issue?
Si es así ¿El tipo del Issue es Bug?
¿Que priordad te parece conveniente asignarle?
¿A que componente afecta esto (Contrib, Core, etc.)?
¿Debe ser expuesta estrictamente en Inglés o puedo agregarla en
Castellano?

Gracias.

Fabio Maulo

unread,
Mar 16, 2007, 4:28:59 PM3/16/07
to NHibernat...@googlegroups.com
Entre lineas
Soporte 06 escribió:

> Fabio,
> No he agregado nunca un error en el proyecto. Ya estoy registrado en
> el Proyecto .
> ¿Agrego este error como un nuevo Issue?
>
Si
> Si es así ¿El tipo del Issue es Bug?
>
Lo que te parezca, nadie te pega.

> ¿Que priordad te parece conveniente asignarle?
>
Dejé la que te propone que así no exageras.

> ¿A que componente afecta esto (Contrib, Core, etc.)?
>
Core

> ¿Debe ser expuesta estrictamente en Inglés o puedo agregarla en
> Castellano?
>
Solo ingles
>
>

Fabio Maulo

unread,
Mar 28, 2007, 4:58:27 PM3/28/07
to NHibernat...@googlegroups.com
Soporte 06 escribió:

> La sentencia SQL es muy grande para enviarla completa pero paso la
> parte con error:
> select elementobu0_.IDELEMENTO as IDJERARQ1_,
> decode( , "elementobu0__8_".IDMAESTRONEGOCIO , 8,) ....
>
>
Investigue un poco mas el tema.
Creía que dependía de la falta de gestión de las HQLFunctions pero NO.

Prueba usando el NHibernate.Dialect.OracleDialect en lugar que
NHibernate.Dialect.Oracle9Dialect.
Te recuerdo que en la HQL NO tenes que usar la sintaxis de ORACLE si no
que tenes que usar la sintaxis de HQL que, en este caso, corresponde a
la <case expression> de SQL92.
Con eso te tendría que funcionar; si no te funciona es que hay un bug en
NHibernate.SqlCommand.DecodeCaseFragment porque me da la impresión que
no está muy bien hecha.

Bye.
Fabio.

P.S. La sintaxis de <case expression> es
CASE WHEN <search expression> THEN <result expression> [[WHEN <search
expression> THEN <result expression>]...] [ELSE <result expression>]

Ejemplo:
CASE
WHEN propiedad > 60000 THEN 'A'
WHEN propiedad > 30000 THEN 'B'
ELSE 'C'


Reply all
Reply to author
Forward
0 new messages