Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problema con EXECUTE STATEMENT (https://www.clubdelphi.com/foros/showthread.php?t=10610)

taote 24-05-2004 17:27:06

Problema con EXECUTE STATEMENT
 
Hola:

Recien descubiertas las EXECUTE STATEMENT las he implementado en un procedimiento almacenado. He utilizado IBExpert para implementarlas y al probarla con el Debugger todo va perfecto, pero al ejecutarla directamente me da un error:

Variable type (position 0) in EXECUTE STATEMENT 'SELECT COUNT(CODIGO) FROM DOCUMENTOS WHERE CODIGO=' INTO does not match return.

La sentencia SQL es:

Código SQL [-]
EXECUTE STATEMENT 'SELECT COUNT(' || :CAMPO || ') FROM ' || :TABLA ||' WHERE '|| :CAMPO ||'=' ||:CODIGO INTO :CANTIDAD;

No se qué puede estar pasando.

A ver si alguien puede ayudarme, gracias de antemano.

guillotmarc 24-05-2004 17:43:49

Hola.

¿ De que tipo es :CANTIDAD ? Prueba a definirlo como BIGINT.

Saludos.

guillotmarc 24-05-2004 17:46:04

Hola

Asegúrate de que el parámetro :CODIGO tiene algún valor, por la sentencia construida en el mensaje de error, podría ser que ese parámetro estuviese nulo.

Antes de ejecutar el EXECUTE STATEMENT, podrias poner algo como :

if (:CODIGO is null) then CODIGO = -1;

Saludos.

taote 24-05-2004 17:52:25

Hola.

Gracias por la respuesta, pero he probado las dos cosas y nada. De todas maneras cuando :CAMPO tiene otro valor más largo, en el mensaje de error sale cortado. Es muy raro porque en el debugger va bien, pero no si lo ejecuto directamente. ¿Acaso es por el Where? No se , quizas no está bien construida la cadena.

:(

jachguate 24-05-2004 18:08:37

Creo que el problema es que no te está concatenando el último parámetro, es decir el valor de :codigo.

probá sin concatenar el parámetro, solo para confirmar. Digamos

Código SQL [-]
EXECUTE STATEMENT 'SELECT COUNT(' || :CAMPO || ') FROM ' || :TABLA ||' WHERE '|| :CAMPO ||'= 1';

y luego hacer un cast del valor numérico (que me imagino) que recibis, convirtiendolo en un valor varchar.

Hasta luego.

;)

taote 24-05-2004 18:52:45

Uf, :( sigo igual. Es muy raro, es como si la parte de la cadena del EXECUTE STATEMENT que va delante del INTO estuviese limitada, porque si a la sentencia que he puesto antes la acorto, el mensaje de error ya incluye parte del código, por ejemplo:

Código:

Unsuccessful execution caused by an unavailable resource.
Variable type (position 0) in EXECUTE STATEMENT 'SELECT MAX(CODIGO) FROM DOCUMENTOS WHERE CODIGO=00' INTO does not match return.

Yo no se si es un problema de Firebird 1.5 o de IBExpert o de que, pero el caso es que voy a perder la cabeza con esto.

¿Sabe alguien si es que está limitado?. ¿Hay alguna otra manera de hacer algo parecido?

Gracias por todas las respuestas

jachguate 24-05-2004 19:03:34

Lo que es limitado es la longitud de los mensajes de error... creo que el secreto está en:

Cita:

Empezado por taote
INTO does not match return

Pues parece un problema con el tipo de dato de la variable usada en la clausula INTO.

o bien por:

Cita:

Empezado por taote
caused by an unavailable resource

que parece que el problema es que la varaible no está declarada...

Hasta luego.

;)

celades 24-05-2004 19:16:15

Hola

si el campo (campo) de la tabla (tabla) es de tipo varchar falrtarian las comillas

Código:

EXECUTE STATEMENT 'select COUNT(' || :CAMPO || ') FROM ' || :TABLA ||' WHERE '|| :CAMPO ||'=''' ||:CODIGO||'''' INTO :CANTIDAD;


Por cierto no se donde estan las etiquetas sql

jachguate 24-05-2004 19:29:09

Cita:

Empezado por celades
Por cierto no se donde estan las etiquetas sql

Hay un mensaje al inicio de cada foro que explica algo de su uso. También hay un vínculo en mi firma a la ayuda de la etiqueta [ CODE ] que se usa exactamente igual que la [ SQL ] y [ DELPHI ].

En el editor WYSIWYG no hay ningún botón para insertarlas... debido a que esto es un "plugin" desarrollado por román y cadetill, y no una parte "estándar" del vBulletin; pero nada te impide insertarlas desde el teclado...

Hasta luego.

;)

taote 25-05-2004 09:15:15

Uf! Arreglado. :rolleyes: Esto era para voverse loco.

El problema estaba en la declaración de CANTIDAD, pues estaba al principio definido como SMALLINT, tras el mensaje:


Cita:

Empezado por guillotmarc
¿ De que tipo es :CANTIDAD ? Prueba a definirlo como BIGINT.

lo definí como BIGINT, y tras la n-ésima prueba lo he cambiado a INTEGER, y ahora funciona perfectamente. :D

Gracias a todos por vuestras respuestas.

guillotmarc 25-05-2004 10:08:32

Hola.

Es lógico que deba ser del tipo INT, tiene que ser del mismo tipo que el campo sobre el que se calcula el MAX. (Aunque propuse que probaras el BIGINT porqué di por sentado que estaba fallando con el tipo INT).

Saludos.


La franja horaria es GMT +2. Ahora son las 19:30:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi