在firebird数据库中插入大量行

时间:2016-10-13 07:05:26

标签: sql firebird firebird2.5

Firebird 2.5与IB Expert。

我有一个SQL脚本在数据库中添加大量行

execute block as declare ID2 int; begin
EXECUTE PROCEDURE NEW_PROCEDURE('1', '33001', 'be0ad759-ee6a-4a21-b5f9-ed71f1eba54c00', 'Новое оборудование') returning_values :ID2;
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'От 13.10.2016 № 1', 'Поступления');
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'В составе Новое оборудование, в составе Новое оборудование', 'В составе');
EXECUTE PROCEDURE NEW_PROCEDURE('1', '3200', '91403ed6-56af-4acf-b66e-50c10118e4e60', 'Новое оборудование') returning_values :ID2;
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'От 13.10.2016 № 1', 'Поступления');
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'В составе Новое оборудование', 'В составе');
EXECUTE PROCEDURE NEW_PROCEDURE('1', '33010', 'be0ad759-ee6a-4a21-b5f9-ed71f1eba54c01', 'Новое оборудование') returning_values :ID2;
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'От 13.10.2016 № 1', 'Поступления');
EXECUTE PROCEDURE NEW_PROCEDURE2('1', :ID2, '13.10.2016', 'В составе Новое оборудование, в составе Новое оборудование', 'В составе');
+100K
end
从代码数据的例子可以看出几乎相同,但错误输出

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Unexpected end of command - line 489, column 87.

1 个答案:

答案 0 :(得分:3)

根据您提到的行数(100K),您的语句大小超过64千字节(这是Firebird 2.5及更早版本中的最大语句大小)。 execute block是单个语句,因此您需要减少执行块中的语句数,使其适合64千字节。

Firebird 3允许使用更大的语句,但只有在使用新API执行时,才能从IB Expert执行时无效。

或者,当您的查询工具使用分号作为默认语句终止符时,也会导致相同的错误。 Firebird执行每个语句,因此大多数查询工具将在分号上拆分以逐个发送语句。但是execute block内部也使用分号。这意味着它只发送

而不是完整的execute block
execute block as declare ID2 int

作为一个语句,它不是一个完整的语句,它会导致Firebird报告意外的命令结束 -error。

为了能够执行此操作,您需要指示查询工具切换语句终止符。对于大多数Firebird工具,这是set term,例如set term #;会将工具语句终止符切换为#

你需要执行:

set term #;

execute block as 
  declare ID2 int; 
begin
  EXECUTE PROCEDURE NEW_PROCEDURE('1', '33001', 'be0ad759-ee6a-4a21-b5f9-ed71f1eba54c00', 'Новое оборудование') returning_values :ID2;
  ...
end#

set term ;#

另见SET TERM terminator or terminating character