PDA

Ver la Versión Completa : Problemita en query


marceloalegre
01-08-2005, 21:06:00
Buenos dias, tengo inconveniente con esa consulta:

INSERT INTO TABLAS (
DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)
Select
:DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,

UTILIZA_LLAMADA_ENTRANTE
from tablas
where
ID_TABLA = :ID_TABLA_A_COPIAR;


mi idea es insertar dentro de la tabla tablas el mismo dato que ya tiene con otro nro de id que ya se ingresa automatico con un generator.
el problema es que al ejecutar esto en ibexpert, sql editor, me dice :
incompatible column/host variable daa type.
Dynamic SQL Error.
SQL error code = -303.
conversion error from string "NombreTest".

tengo algun problema con la descripcion,, mi descripcion es un varchar de longitud 35... necesito algun casteo? como tendria que modificar esta query para que no me salga este error??

Muchas gracias a todos!

vtdeleon
02-08-2005, 01:26:52
Saludos

Haciendo un analisis rapido, falta poner Values INSERT INTO TABLAS (
DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)
/*Aqui*/
values (
Select
:DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,

UTILIZA_LLAMADA_ENTRANTE
from tablas
where
ID_TABLA = :ID_TABLA_A_COPIAR)Suerte

marceloalegre
02-08-2005, 03:56:12
no, no es necesario el uso de values, la query puedo ejecutarla perfectamente solo tengo un problema que se debe solucionar con cast calculo pero no se bien como encajarlo en la consulta...
se puede ver eso claramente por lo que dice la query cuando la ejecuto


incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
conversion error from string "NombreTest".


Alguien puede ayudar con mi consulta? Gracias

Crandel
02-08-2005, 05:49:28
Hola, no necesitas el value.

sólo queres copiar un registro o toda la tabla?

Quien es "NombreTest"?

como son las estructuras de las dos tablas?

hector.roma
02-08-2005, 13:12:14
Yo creo que falta values o sobra la lista de campos

roman
02-08-2005, 18:52:30
En


select
:DESCRIPCION


¿que no sobran esos dos puntos? Si se estuviera insertando un sólo registro usando VALUES entonces se pueden pasar como parámetros los valores de los campos, pero aquí se está usando un SELECT de manera que estamos hablando de los nombres de los campos y no de sus valores. ¿En IB pueden pasarse como parámetros a una consulta los nombres de los campos?

// Saludos

Crandel
02-08-2005, 19:28:39
En realidad con el select le estamos pidiendo los valores de esos campos

roman
02-08-2005, 19:34:06
En realidad con el select le estamos pidiendo los valores de esos campos

Sí claro, pero para obtener esos valores, el texto de la consulta especifica el nombre de los campos, y esto es lo que se está intentando pasar como parámetro.

// Saludos

marceloalegre
03-08-2005, 13:37:25
Buenas, ante todo, Gracias por responder! les detallo mas el tema, quizas no he sido muy claro el tema, el tema seria que tengo esta pequeña query donde estaria reutilizando los campos del registro anterior para la generacion de un nuevo registro de entrada:


INSERT INTO TABLAS (
DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)
Select
:DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,

UTILIZA_LLAMADA_ENTRANTE
from tablas
where
ID_TABLA = :ID_TABLA_A_COPIAR;


En el select le pongo : a descripcion porque quiero ingresar yo ese valor para que lo inserte en la tabla.(puede que mi error este ahi, porque estoy haciendo un select de un valor que estaria "cableado" o fijo a lo que ponga, no estoy seguro si eso es correcto o no, pero creo que puede ser un tema de casteo, puesto que si pongo un valos entre '' me funciona sin problemas.

Despues tengo :id_tabla_a_copiar ese es un campo tambien de entrada donde pongo un id existente y me copia todos los datos al nuevo registro, a excepcion de la descripcion que la quiero de entrada.

mi error como les mostre es:

incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
conversion error from string "NombreTest".

donde NombreTest es un ejemplo de un valor de entrada para el campo descripcion, puse nombretest podia ser cualquier cosa, es unvarchar de hasta 35 caracteres.

Lo que dice el error al ejecutarlo segun puedo entender es :

incompatible column/host variable data type.


tipo de datos incompatible... no se si podre aplicar un cast para el dato o cual es el problema concreto, quisas alguien con mayores conocimientos de este tema me pueda asistir..

Muchas Gracias!!

marceloalegre
03-08-2005, 20:40:30
En cuanto a lo que tu dices roman, si, estoy pasando descripcion como parametro dentro del select, eso no me ha dado problemas nunca por lo menos con interbase...

roman
03-08-2005, 21:06:15
si, estoy pasando descripcion como parametro dentro del select, eso no me ha dado problemas nunca por lo menos con interbase...

No me convences. Sé que es aventurado decir esto puesto que no uso las componentes IB pero curiosamente el mismo error de incompatibilidad de tipos me da cuando hago la prueba con el bde.

Por otra parte mencionaste antes que si pones un valor explícito sí funciona. Es decir, según entiendo, si pones:


INSERT INTO TABLAS (
DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)
Select
'NombreTest',
FECHA_DESDE,
FECHA_HASTA,

UTILIZA_LLAMADA_ENTRANTE
from tablas
where
ID_TABLA = :ID_TABLA_A_COPIAR;


funcion a, ¿cierto? ¿Por qué no intentas sustituyendo el valor de DESCRIPCION de otra manera, por ejemplo, declara una constante con el texto de la consulta:


const
fmtSql =
'INSERT INTO TABLAS ('#13 +
'DESCRIPCION,'#13 +
'FECHA_DESDE,'#13 +
'FECHA_HASTA,'#13 +
'UTILIZA_LLAMADA_ENTRANTE)'#13 +
'Select'#13 +
'"%s",'#13 +
'FECHA_DESDE,'#13 +
'FECHA_HASTA,'#13 +

'UTILIZA_LLAMADA_ENTRANTE'#13 +
'from tablas'#13 +
'where'#13 +
'ID_TABLA = :ID_TABLA_A_COPIAR';


Al asignar el texto de la consulta a la componente usas Format:

Format(fmtSql, [Descripcion])

Format te devolverá el mismo texto pero con '%s' sustituido por el valor que tenga la variable Descripción.

// Saludos

Crandel
03-08-2005, 21:52:58
Hola kanvictor, no estoy muy seguro de que puedas pasar el parámetro de descripción de esa forma en el select.

yo lo separaría en dos SQL


INSERT INTO TABLAS (
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)

Select
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE
from tablas

where
ID_TABLA = :ID_TABLA_A_COPIAR;


Luego


UPDATE TABLAS
SET DESCRIPCION = :pDESCRIPCION
WHERE
ID_TABLA = :ID_TABLA_A_COPIAR;

roman
03-08-2005, 22:03:22
Pero no es necesario. El valor que va a entrar al campo DESCRIPCION es el mismo para todos los registros insertados y puede hacerse desde la primera consulta, sólo que no puede sustituirse como si fuera un parámetro pero sí como describí antes. Al menos funciona en Paradox y sería raro que Paradox pueda hacer algo que Interbase no.

// Saludos

Crandel
03-08-2005, 22:17:07
pero en FB/IB no se puede colocar un valor que reemplace el nombre del campo en una instrucción SQL.

roman
03-08-2005, 22:22:43
¿O sea que no se puede hacer una cosulta del tipo


select campo1, campo2, "dato fijo"
from tabla


Qué triste :(

// Saludos

roman
03-08-2005, 22:57:09
Acabo de instalar firebird 1.5, creé dos tablas de prueba e inserté datos de una a otra tal como describí anteriormente y funcionó sin problemas.

// Saludos

Crandel
03-08-2005, 23:03:40
si funciona :D , pero con comillas simples

ya voy a probar la otra instruccion.

Crandel
03-08-2005, 23:05:15
instalaste firebird sólo para probarlo ??? :eek:

que dedicación !!!!

roman
03-08-2005, 23:19:12
instalaste firebird sólo para probarlo ???

Y no sólo Firebird, también el IBExpert :) . Lo que pasa es que en otro hilo (http://www.clubdelphi.com/foros/showthread.php?t=23726) de hoy se habló de esto mismo así que necesitaba comprobarlo por mi mismo antes de seguir diciendo que si algo se puede en paradox también se puede en ib/fb ;)

// Saludos

Crandel
04-08-2005, 01:11:18
probe recien de nuevo la instrucción que planteo originalmente kanvictor, para lograr hacer las dos cosas en una sola instrucción, pero no puede hacer que funcione.

Probe con cast y tampoco.

que raro. :confused:

marceloalegre
04-08-2005, 13:53:13
Buen dia:
quiero agradecerles por responder,Crandel, Roman, gracias por preocuparse!!, sin palabras.

Te cuento roman que es muy buena tu idea del tema del format, justamente en este caso no me va a servir, estoy trabajando con las famosas dbexpress (no las puedo ni ver yo :( ) y necesito hacer para esto un stored dentro de la db.
Pero con lo que posteaste he aprendido algo nuevo que seguramente implementare!, gracias!

En cuanto al parametro dentro del select aunque no te convence honestamente tengo otras consulta que funcionan sin problemas, pero no estoy usando datos de tipo varchar.

Es muy temprano aun cuando me tome el primer cafe de la mañana voy seguir con esto asi soluciono este problema. Y MUCHAS, PERO MUCHAS GRACIAS!!

marceloalegre
04-08-2005, 14:38:17
Amigos, les cuento que al crearlo como un stored funciona perfectamente, ya lo he ejecutado,, en el ejemplo tambien saco el id_tabla que era irrelevante a mi pregunta pero lo necesitaba.

Fijense que a descripcion le asigno primero el valor como paramentro, y despues en el select lo utilizo como parametro.. es muy raro este interbase, de esta manera funciona perfecto al ejecutarlo, sacandole el paramentro al select daba error, me parece redundante, pero funciona.

No me pregunten por que,, pero sin ser store como una query normal no tuve manera de solucionar el problema (trate con cast pero nada...) (por suerte necesitaba store!)

Aca esta la solución:


SET TERM ^ ;
CREATE PROCEDURE GRACIAS_CLUBDELPHI (
DESCRIPCION VARCHAR(35),
ID_TABLA_A_COPIAR INTEGER)
RETURNS (
ID_TABLA INTEGER)
AS
BEGIN
ID_TABLA = ( Gen_Id(G_ID_TABLA, 0) + 1 );
DESCRIPCION = :DESCRIPCION;

INSERT INTO TABLAS (
DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE)


Select
:DESCRIPCION,
FECHA_DESDE,
FECHA_HASTA,
UTILIZA_LLAMADA_ENTRANTE

from tablas

where
ID_TABLA = :ID_TABLA_A_COPIAR;

END
^
SET TERM ;^


MUCHAS GRACIAS A TODOS!!!!! ;)