TIB_Script 运行 大脚本
TIB_Script run large script
我遇到了 IB_Script 在 运行 运行更长的脚本时返回错误的问题:
SQL Error Code = -104
Unexpected end of command - line 18, column 52
只要脚本中的字符数不超过65536个字符(当前为66.186),就不会出现这样的错误提示。
我使用以下代码上传IB_Script:
with dm.DDLScript do
begin
try
SQL.Clear;
SQL.Add('SET TERM ^;');
SQL.Add(Format('CREATE OR ALTER PACKAGE %s', [ObjectName]));
SQL.Add('AS');
SQL.AddStrings(hdr.Lines); // hdr > TSynEdit
Execute;
SQL.Clear;
SQL.Add('SET TERM ^;');
SQL.Add(Format('RECREATE PACKAGE BODY %s', [ObjectName]));
SQL.Add('AS');
SQL.AddStrings(bdy.Lines); // bdy > TSynEdit
SQL.Add('^');
Execute;
ObjectMod := false;
except
on e:exception do
begin
messageDlg(e.Message, mtError,[mbOk], 0);
abort;
end;
end;
end;
有没有人遇到过类似的问题?不可能 运行 脚本中的字符数较少,因为它将是如图所示的 PACKAGE BODY。
Firebird 2.5及更早版本只支持64KB(65535字节)的语句,这个限制也体现在fbclient.dllAPI中,大小为16位无符号整数。 Firebird 3.0 将限制增加到 10MB,但这需要 Firebird 3.0 或更高版本的 fbclient,并且要么使用新的面向对象 API,要么传递长度为零的语句,并将语句文本作为 NUL-终止字符串。
很可能,您正在使用的库明确传递了大小,并且这个大小溢出了,导致 Firebird 只接收到正在发送的语句的一小部分(或者至少,我猜第 18 行第 52 列是字符比 65535 少很多)。当 Firebird 收到不完整的语句时,它会产生错误“意外的命令结束”。
我自己不编写 Delphi,但解决方案需要在库中进行修改,以将大小为 0 的语句作为 NUL 终止字符串传递给 isc_dsql_prepare
。
我遇到了 IB_Script 在 运行 运行更长的脚本时返回错误的问题:
SQL Error Code = -104 Unexpected end of command - line 18, column 52
只要脚本中的字符数不超过65536个字符(当前为66.186),就不会出现这样的错误提示。
我使用以下代码上传IB_Script:
with dm.DDLScript do
begin
try
SQL.Clear;
SQL.Add('SET TERM ^;');
SQL.Add(Format('CREATE OR ALTER PACKAGE %s', [ObjectName]));
SQL.Add('AS');
SQL.AddStrings(hdr.Lines); // hdr > TSynEdit
Execute;
SQL.Clear;
SQL.Add('SET TERM ^;');
SQL.Add(Format('RECREATE PACKAGE BODY %s', [ObjectName]));
SQL.Add('AS');
SQL.AddStrings(bdy.Lines); // bdy > TSynEdit
SQL.Add('^');
Execute;
ObjectMod := false;
except
on e:exception do
begin
messageDlg(e.Message, mtError,[mbOk], 0);
abort;
end;
end;
end;
有没有人遇到过类似的问题?不可能 运行 脚本中的字符数较少,因为它将是如图所示的 PACKAGE BODY。
Firebird 2.5及更早版本只支持64KB(65535字节)的语句,这个限制也体现在fbclient.dllAPI中,大小为16位无符号整数。 Firebird 3.0 将限制增加到 10MB,但这需要 Firebird 3.0 或更高版本的 fbclient,并且要么使用新的面向对象 API,要么传递长度为零的语句,并将语句文本作为 NUL-终止字符串。
很可能,您正在使用的库明确传递了大小,并且这个大小溢出了,导致 Firebird 只接收到正在发送的语句的一小部分(或者至少,我猜第 18 行第 52 列是字符比 65535 少很多)。当 Firebird 收到不完整的语句时,它会产生错误“意外的命令结束”。
我自己不编写 Delphi,但解决方案需要在库中进行修改,以将大小为 0 的语句作为 NUL 终止字符串传递给 isc_dsql_prepare
。