So, hier meine vorübergehende Lösung des Problems, dass TZSqlProcessor "SET TERM" nicht richtig ausgewertet hat (obwohl es das mit mtSetTerm sollt).
Das ganze noch als Function. Packe das am Ende des Projektes noch in eine Klasse und baue ein Rollback ein (wenn Zeos das zulässt)
Delphi-Quellcode:
uses
SysUtils, Classes, ZConnection, ZDataSet;
// Execute a MetaScript (e.g. from FlameRobin)
// Result is empty if no error else contains the TZQuery exception message
function ExecuteMetaScript(AOwner : TComponent; Connection : TZConnection; Script : TStringList):
String;
function TermChanged(
Sql :
String;
var Term : Char): Boolean;
var
Part :
String;
begin
Result := False;
Part := UpperCase(Trim(
Sql));
if Pos('
SET', Part) = 1
then begin
Part := Trim(Copy(Part, 4, 1024));
if Pos('
TERM', Part) = 1
then begin
Part := Trim(Copy(Part, 5, 1024));
if Part <> '
'
then begin
Term := Part[1];
Result := True;
end;
end;
end;
end;
const
SqlTerm : Char = '
;';
var
i : Integer;
Term : Char;
Query : TZQuery;
begin
Result := '
';
Term := SqlTerm;
Query := TZQuery.Create(AOwner);
try
Query.Connection := Connection;
for i := 0
to Script.Count - 1
do begin
// SET TERM prüfen und gleichzeitig ausklammern
if not TermChanged(Script[i], Term)
then begin
if Term <> SqlTerm
then
Query.SQL.Add(StringReplace(Script[i], Term, SqlTerm, [rfReplaceAll]))
else
Query.SQL.Add(Script[i]);
if Pos(Term, Script[i]) > 0
then begin
try
Query.ExecSQL;
except
on E:
Exception do Result := E.
Message;
end;
Query.SQL.Clear;
end;
end;
end;
finally
Query.Free;
end;
end;
Ein relativ komplexes MetaScript mit Triggern von FlameRobin wurde sauber verarbeitet.
Falls jemand einen Fehler sieht, bitte mitteilen, korrigiere das dann spätestens beim Anlegen der Klasse.
Wenn jemand ein funktionierenden Code hat, der FlameRobin-MetaScripte (oder vergleichbare) mit "SET TERM" (Trigger, Procedures) via TZSqlProcessor verarbeiten kann, auch her damit