Uniloader with Firebird -> "Implementation Limit Exceeded"
Posted: Fri 26 Jul 2013 23:58
I get an error when using UNILOADER.LOADFROMDATASET(q1) with Firebird.
Some tables are fine, but if the record size is even
slightly larger than tiny the error occurs.
A Single varchar(1000) field will work but increase the
size to varchar(1400) and your stuck.
The error is:
SQL Error Code= -204
Implementation Limit Exceeded
Block size exceeds implementation restriction
Yes, I have seen one other poster mention this and he found that this
is a Firebird limitation related to insert statement size & block size.
The Firebird FAQ explains the cause of the error:
"This Means That your SQL statement has breached the limit for SQL statement size.
The limit is 64kB for statement text..."
In my stripped-down test (shown below) I receive the error when
trying to send 1 record with ['Tom', 10].
1) while I understand that the error occurs on the Firebird side
my simple 1 record/2 field example should not be sending anywhere
near 64k statement text after uniloader has transformed it.
2) Firebird accepts tUNIQuery SQL insert statements that simultaneously
fill dozens of large varchars at the same time - so it would seem
that the limitation is not the Firebird server alone.
//create two tables and add 1 record
CREATE TABLE TEST_SOURCE(
A VARCHAR(1400) DEFAULT '' ,
B INTEGER DEFAULT 0 );
INSERT INTO TEST_SOURCE (A,B) VALUES('TOM',10);
CREATE TABLE TEST_DEST(
A VARCHAR(1400) DEFAULT '' ,
B INTEGER DEFAULT 0 );
//simple example code that generates FIREBIRD Error for varchar(1400)
q1:=txquery.create(nil);
uniloader:= tuniloader.create(nil);
try
q1.sqlconnection:=mconnection1;
uniloader.connection:=mconnection1;
uniloader.tablename:='test_dest';
uniloader.CreateColumns;
//
q1.sql.text:='select a,b from test_source';
q1.open; //pulls exactly 1 record
//
uniloader.LoadFromDataSet(q1);
The earlier poster fixed this problem by splitting the uniloader
operations - filling some fields, then the rest of the fields
to avoid this mysterious size limitation.
With a varchar(1400) one could not do that.
How is such a simple little table and tiny bit of data
exceeding *anything* when sent using UniLoader?
Thanks for your time,
tonyM
Some tables are fine, but if the record size is even
slightly larger than tiny the error occurs.
A Single varchar(1000) field will work but increase the
size to varchar(1400) and your stuck.
The error is:
SQL Error Code= -204
Implementation Limit Exceeded
Block size exceeds implementation restriction
Yes, I have seen one other poster mention this and he found that this
is a Firebird limitation related to insert statement size & block size.
The Firebird FAQ explains the cause of the error:
"This Means That your SQL statement has breached the limit for SQL statement size.
The limit is 64kB for statement text..."
In my stripped-down test (shown below) I receive the error when
trying to send 1 record with ['Tom', 10].
1) while I understand that the error occurs on the Firebird side
my simple 1 record/2 field example should not be sending anywhere
near 64k statement text after uniloader has transformed it.
2) Firebird accepts tUNIQuery SQL insert statements that simultaneously
fill dozens of large varchars at the same time - so it would seem
that the limitation is not the Firebird server alone.
//create two tables and add 1 record
CREATE TABLE TEST_SOURCE(
A VARCHAR(1400) DEFAULT '' ,
B INTEGER DEFAULT 0 );
INSERT INTO TEST_SOURCE (A,B) VALUES('TOM',10);
CREATE TABLE TEST_DEST(
A VARCHAR(1400) DEFAULT '' ,
B INTEGER DEFAULT 0 );
//simple example code that generates FIREBIRD Error for varchar(1400)
q1:=txquery.create(nil);
uniloader:= tuniloader.create(nil);
try
q1.sqlconnection:=mconnection1;
uniloader.connection:=mconnection1;
uniloader.tablename:='test_dest';
uniloader.CreateColumns;
//
q1.sql.text:='select a,b from test_source';
q1.open; //pulls exactly 1 record
//
uniloader.LoadFromDataSet(q1);
The earlier poster fixed this problem by splitting the uniloader
operations - filling some fields, then the rest of the fields
to avoid this mysterious size limitation.
With a varchar(1400) one could not do that.
How is such a simple little table and tiny bit of data
exceeding *anything* when sent using UniLoader?
Thanks for your time,
tonyM