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.
答案 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 ;#