Anmelden

View Full Version : Trigger mit Operations Navigator



Karo
07-12-07, 10:24
Hallo,

könnt ihr mir evtl. bei folgendem Problem weiterhelfen?

Wir wollen bei einer Datei immer einen Satz ausgeben, wenn etwas geändert, erfasst oder gelöscht wird. Dazu wird der User, der Event, der Auslöser, der Zeitstempel und der gesamte Datensatz weggeschrieben. Leider funktioniert dies aber nicht.

Zum testen des SQL Befehls habe ich auf der AS400 folgenden funktionsfähigen Befehl eingegeben:
insert into xxlib/xxfile (select a.*, USER, 'B', 'U', CURRENT TIME from tmpalt a)
insert into xxlib/xxfile (select a.*, USER, 'A', 'U', CURRENT TIME from tmpneu a)

Erläuterung: 'A' = after, 'B' = before, 'U' = update, 'D' wäre Delete, 'I' wäre Insert

Gebe ich den folgenden Befehl (bei den Trigger SQL Anweisungen) über den Operations Navigator ein,
BEGIN ATOMIC
insert into xxlib.xxfile (select a.*, USER, '1', '2', CURRENT TIME from tmpalt a);
insert into xxlib.xxfile (select a.*, USER, '1', '2', CURRENT TIME from tmpneu a);
END
kommt folgende Fehlermeldung:

Wert für Spalte oder Variable XTIME nicht verträglich.

Nachrichten-ID:SQL0408

Ursache . . . . : Die Datenart des Quellenwerts ist mit der Datenart der Zielspalte oder der Variablen XTIME nicht verträglich. Handelt es sich bei der Anweisung um eine Anweisung INSERT oder UPDATE, ist XTIME eine Spalte in Tabelle XXFILE in XXLIB.-- Einer Spalte einer numerischen Art können Werte einer numerischen Art zugeordnet werden.-- Einer Spalte der Art Zeichen, DBCS, Grafik oder LOB können Daten der Art Zeichen, DBCS, Grafik oder LOB (großes Objekt) zugeordnet werden.-- Einer Spalte der Art Zeichen, DBCS oder Grafik kann ein Datums-, Zeit- oder Zeitmarkenwert zugeordnet werden.-- Einer Spalte der Art Datum, Zeit oder Zeitmarke kann ein Wert der Art Zeichen, DBCS oder Grafik zugeordnet werden.-- Einem Datum kann ein Datumswert zugeordnet werden.-- Einer Uhrzeit kann ein Zeitwert zugeordnet werden.-- Einer Zeitmarke kann ein Zeitmarkenwert zugeordnet werden.-- Ein Wert, der einer benutzerdefinierten Art zugeordnet wird, muss in die Quellenart umgestuft werden können.-- Bei der Zuordnung zu einer Datalink muss die Funktion DLVALUE angegeben werden.Fehlerbeseitigung: Die Spalte, die Host-Variable, die Konstante oder die Funktion, die XTIME zugeordnet ist, so ändern, dass sie verträglich ist. Die Anforderung wiederholen.

Kann mir jemand weiterhelfen, der schon ähnliche Erfahrungen gemacht hat?
Vielen Dank.

Gruß, Karo

Robi
07-12-07, 14:26
nur als Idee
Kann es sein, das das time Format im Opsnerv anders ist als das Timeformat wenn du mit SQL arbeitest ?
Robi

Fuerchau
07-12-07, 17:49
So wie ich das sehe, ist das Zielfeld eben nicht vom Typ TIME sondern ggf. nur Typ DEC.

In diesem Fall musst du den Zeitwert casten.

Karo
12-12-07, 08:54
Der Fehler kann nicht sein, denn

1. ist das Feld XTIME nicht als DEC sondern als String definiert und
2. selbst wenn man nur versucht einen einfachen String an das Feld zu übergeben funktionierts nicht und
3. würde es dann auch nicht in das Feld schreiben lassen wenn ich's über zwei SQL Befehle mach. Dies funktioniert nämlich.

Beispiel:
Trigger XXFILE Update
BEGIN ATOMIC
Update XXLIB.XXFILET set lfdNummer = lfdNummer + 1, XUSER = USER, XEVEN = 'U', XSTAT = 'B', XZEIT = CURRENT TIMESTAMP;
insert into XXLIB.XXFILE (select * from XXLIB.XXFILET, tmpalt);
Update XXLIB.XXFILET set XSTAT = 'A';
insert into XXLIB.XXFILE (select * from XXLIB.XXFILET, tmpneu);
END


4. haben wir die Zeit schonmal als Test umgestellt

Leider ist die Lösung 3. vermutlich dafür verantwortlich, dass nun Massenjobs sehr lange laufen, wenn der Trigger eingestellt ist. Teils 5x so lang!

Habt ihr noch weitere Ideen?

Gruß, Karo

B.Hauser
12-12-07, 11:57
Hallo!

Du sagst es:
Feld XTIME nicht als DEC sondern als String

Current_Timestamp ist jedoch eine echte Zeitmarke.
Damit ist der Wert für die Spalte XTIME nicht verträglich.
(Schau Dir mal spasseshalber den Hex-Wert von Current_Timestamp an:

Select Hex(Current_Timestamp) from SysIbm/SysDummy1

Du musst die Zeitmarke in ein alphanumerisches Feld umwandeln und dieses dann beim Insert, Update oder Delete verwenden.

Aus Performancegründen würde ich die Konvertierung einmalig machen und an alle betroffenen Sätze übergeben. (Sofern es nicht genau auf den Bruchteil einer Sekunde ankommt und der ist bei Massen-Inserts, Updates oder Deletes eh' nicht eindeutig!)


Declare MyCharTime CHAR(20);
Set MyCharTime = CHAR(Current_TimeStamp);

oder


Update ...
Set XTime = Char(Current_Timestamp);

Birgitta