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