Hola.
Para aportar mas datos, usando esta tabla:
Código SQL
[-]
CREATE TABLE PRUEBA (
CP_SMALLINT SMALLINT,
CP_INTEGER INTEGER,
CP_BIGINT BIGINT,
CP_FLOAT FLOAT,
CP_DOUBLEPRECISION DOUBLE PRECISION,
CP_NUMERIC NUMERIC(15, 3),
CP_DECIMAL DECIMAL(15, 3));
hice unas pruebas con TIBDataset, variando en la cláusula SELECT: CP_SMALLINT, CP_INTEGER, CP_BIGINT, CP_FLOAT, P_DOUBLEPRECISION, CP_NUMERIC y CP_DECIMAL.
Con el código:
Código Delphi
[-]
IBDataSet1.Close;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('SELECT CP_SMALLINT FROM PRUEBA');
IBDataSet1.SelectSQL.Add('WHERE :CLAVE IS NULL');
IBDataSet1.Open;
En todos los casos obtuve el error: "Tipo de datos SQL desconocido (32766)", sin siquiera asignar valor al parámetro. Lo que me induce a pensar que esta forma de llamada es incorrecta.
Con el código:
Código Delphi
[-]
IBDataSet1.Close;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('SELECT CP_SMALLINT FROM PRUEBA');
IBDataSet1.SelectSQL.Add('WHERE Coalesce(:Clave, 0) = 0');
...
IBDataSet1.Open;
Sin asignar valor al parámetro no arroja error en ningún caso. Asignando el valor que nos dió gluglu con cualquier tipo de entero, me dá el mismo error de overflow que a él.
Con el código:
Código Delphi
[-]
IBDataSet1.Close;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('SELECT CP_SMALLINT FROM PRUEBA');
IBDataSet1.SelectSQL.Add('WHERE CAST(:CLAVE AS SMALLINT) IS NULL');
...
IBDataSet1.Open;
No obtuve error en ningún caso, asignando o no, valores al parámetro CLAVE.
Saludos.