Einzelnen Beitrag anzeigen

Artur

Registriert seit: 31. Dez 2006
Ort: Augsburg
70 Beiträge
 
Delphi XE8 Enterprise
 
#1

unknown ISC error 0

  Alt 17. Nov 2013, 12:31
Datenbank: Firebird • Version: 2.5.2 • Zugriff über: FIBplus
Moin zusammen

ich bastele an einer Replikation herum. Das Ding läuft so, dass jeder Datensatz eine eindeutige ID hat und ein Datum, wann der Datensatz geändert wurde (wird über einen Trigger automatisch geändert).

Der Datenabgleich läuft (ab dem zweiten Mal) so ab:
Über Selects filtere ich, welche Datensätze ein neues Datum gegenüber dem letzten Abgleich haben (Änderung), welche Datensätze in der Tabelle aber nicht in der Historie sind (neuer Datensatz) und welche in der Historie, aber nicht mehr in der Tabelle sind (wurde gelöscht).
Das trage ich dann in eine "Hilfstabelle" ein, die zwischen Client-PC und Server-PC hi- und her kopiert wird. Wenn die nötigen Schritte feststehen, kopiere bzw. lösche ich die Datensätze entsprechend.

Das Ganze klappt soweit relativ gut, aber der Abgleich über Internet ist eher langsam (weil die Hilfstabelle Datensatz für Datensatz kopiert wird). Also bin ich auf die Idee gekommen, diese Hilfstabelle nicht datensatzweise zu kopieren, sondern 15 Datensätze in einen Block zu tun und den dann zu kopieren. Dafür baue ich mir gerade einen Block zusammen, an den ich die Tabelle übergebe, die er zusammenpacken soll. Das Script dazu funktionierte soweit auch einwandfrei, hatte aber noch den Namen der Hilfstabelle und der Zieltabelle festcodiert.

Nachdem ich mehrere Hilfstabellen habe, habe ich den Block in einen String q_stmt ausgelagert und füge die Tabellennamen der Hilfstabelle und der Zieltabelle vor dem Aufruf von Execute Statement ein.

Leider bringt mir das Skript dann in IBExpert zweimal "unknown ISC error 0." und anschließend, wie viele Datensätze in die zweite Tabelle eingefügt wurde (es klappt also einwandfrei). Hat dazu jemand einen Tipp?

Das Ganze schaut derzeit so aus:


Code:
execute block (rep_tn varchar(30) = :rep_tn, pack_tn VARCHAR(30) = :pack_tn)
as
  DECLARE VARIABLE q_stmt VARCHAR(1200);
begin

  q_stmt =

  'execute block as ' ||

  ' DECLARE VARIABLE stmt VARCHAR(1200); ' ||
  ' DECLARE VARIABLE i smallint; ' ||
  ' DECLARE VARIABLE r_guid do_guid; ' ||
  ' DECLARE VARIABLE r_chgd do_zeitstempel; ' ||
  ' DECLARE VARIABLE r_svr_act do_dbaction; ' ||
  ' DECLARE VARIABLE r_clnt_act do_dbaction; ' ||
  ' DECLARE VARIABLE r_tablename varchar(30); ' ||
  ' DECLARE VARIABLE lf char(2); ' ||
  ' DECLARE VARIABLE a_guid do_guid; ' ||

  ' begin ' ||

  ' stmt = ''''; ' ||
  ' i = 0; ' ||
  ' lf = ASCII_CHAR(13)||ASCII_CHAR(10); ' ||

  ' for ' ||
  '  select r.db_guid, r.db_changed_at, r.db_action_svr, r.db_action_clnt ' ||
--    from rp$_1098_angebot r
  '  from ' || :rep_tn ||' r ' ||
  ' into :r_guid, :r_chgd, :r_svr_act, :r_clnt_act ' ||
  ' do ' ||
  ' begin ' ||
  '  stmt = stmt || '''''''' || :r_guid || '''''','''''' || :r_chgd || '''''','''''' ' ||
  '             || :r_svr_act || '''''','''''' || :r_clnt_act ||  '''''''' || lf; ' ||
  ' i = i +1; ' ||
  ' if (i > 15) then ' ||
  ' begin ' ||
  '   i = 0; ' ||
  '   insert into ' || :pack_tn || ' ( db_guid, blockdata ) ' ||
  '     values ( gen_id(gen_db_guid, 1), :stmt ); ' ||
  '   stmt = ''''; ' ||
  ' end ' ||
  ' end ' ||
  ' if (stmt <> '''' ) then ' ||
  ' begin ' ||
  ' insert into ' || :pack_tn || ' ( db_guid, blockdata ) ' ||
  '   values ( gen_id(gen_db_guid, 1), :stmt ); ' ||
  ' end end';

  execute statement q_stmt;

end
Danke vorab für alle Tipps.

Viele Grüße,

Artur
Artur
  Mit Zitat antworten Zitat