Forum
Hallo zusammen,
hier die Lösung für die ich mich entschieden habe.
Mit Hilfe von TRIGGERN wird aus der ersten SQLZEILE alles herausgefiltert was in die Tabelle hineingehört. Die Nummerrierung der SQLZEILENR übernimmt auch ein Trigger.
Funktioniert mit INSERT und auch mit LOAD SHRLEVEL CHANGE. Einzige Konvention: Die erste Zeile muß so aussehen:
— A=C403 B=NORMALER 4711-SQL GV=01.01.1991 GB=31.3.2099 U=OTTO
Hinter den Gleichheitszeichen stehen die Werte nach denen der Tigger sucht (A= Anlage; B= Bezeichnung etc.)
Gruß Klaus
P.S. Wer an allen Details interresiert ist, kann sich bei mir melden. Leider hat es nicht hier ins Forum hineingepaßt(DDL + TRIGGER + LOAD-JCL + SELECT-Output) . Aber vielleicht ist das auch besser so.
DDL für Tabelle:
CREATE TABLE DB.RBJE6T
(RBJE6_ANLAGE CHAR(4) NOT NULL WITH DEFAULT ‚INIT‘
,RBJE6_SQLBEZ CHAR(20) NOT NULL WITH DEFAULT ‚INIT‘
,RBJE6_SQLZEILENR DEC(4) NOT NULL WITH DEFAULT
,RBJE6_GILTVON DATE NOT NULL WITH DEFAULT
‚01.01.0001‘
,RBJE6_GILTBIS DATE NOT NULL WITH DEFAULT
‚31.12.2999‘
,RBJE6_SQLZEILE CHAR(72) NOT NULL WITH DEFAULT
,RBJE6_LASTUSER CHAR(8) NOT NULL WITH DEFAULT
,RBJE6_LASTUPDATE TIMESTAMP NOT NULL WITH DEFAULT
,PRIMARY KEY
(
RBJE6_ANLAGE
,RBJE6_SQLBEZ
,RBJE6_SQLZEILENR
)
)
IN RU005D.RBJE6S
CCSID EBCDIC
;
Und jetzt die TRIGGER DDL (delimiter ist #):
— ANLAGE + SQLBEZ (BEI ERSTEM INSERT) SETZEN AUS SQLZEILE
CREATE TRIGGER DB.RBJE6AI1
AFTER INSERT
ON DB.RBJE6T
REFERENCING NEW AS NEW
FOR EACH ROW MODE DB2SQL
WHEN (
NEW.RBJE6_ANLAGE = ‚INIT‘
AND NEW.RBJE6_SQLBEZ = ‚INIT‘
AND POSSTR(NEW.RBJE6_SQLZEILE,’A=‘) > 0
AND POSSTR(NEW.RBJE6_SQLZEILE,’B=‘) > 0
AND POSSTR(NEW.RBJE6_SQLZEILE,’GV=‘) > 0
AND POSSTR(NEW.RBJE6_SQLZEILE,’GB=‘) > 0
AND POSSTR(NEW.RBJE6_SQLZEILE,’U=‘) > 0
AND POSSTR(NEW.RBJE6_SQLZEILE,‘–‚ ) > 0
)
BEGIN ATOMIC
UPDATE DB.RBJE6T O
SET RBJE6_ANLAGE = SUBSTR(NEW.RBJE6_SQLZEILE
, POSSTR(NEW.RBJE6_SQLZEILE,’A=‘) + 2
, 4
)
, RBJE6_SQLBEZ = SUBSTR(NEW.RBJE6_SQLZEILE
, POSSTR(NEW.RBJE6_SQLZEILE,’B=‘) + 2
, 20
)
, RBJE6_GILTVON = SUBSTR(NEW.RBJE6_SQLZEILE
, POSSTR(NEW.RBJE6_SQLZEILE,’GV=‘) + 3
, 10
)
, RBJE6_GILTBIS = SUBSTR(NEW.RBJE6_SQLZEILE
, POSSTR(NEW.RBJE6_SQLZEILE,’GB=‘) + 3
, 10
)
, RBJE6_LASTUSER = SUBSTR(NEW.RBJE6_SQLZEILE
, POSSTR(NEW.RBJE6_SQLZEILE,’U=‘) + 2
, POSSTR(NEW.RBJE6_SQLZEILE,’U=‘) + 2
, 6
)
, RBJE6_SQLZEILENR = 1
WHERE O.RBJE6_ANLAGE = ‚INIT‘
AND O.RBJE6_SQLBEZ = ‚INIT‘
AND O.RBJE6_SQLZEILENR = 0
;
END
#
— ANLAGE SETZEN BEI ZWEITEM BIS N-TEN SATZ
CREATE TRIGGER DB.RBJE6AI2
AFTER INSERT
ON DB.RBJE6T
REFERENCING NEW AS NEW
FOR EACH ROW MODE DB2SQL
WHEN (
NEW.RBJE6_ANLAGE = ‚INIT‘
)
BEGIN ATOMIC
UPDATE DB.RBJE6T
SET RBJE6_ANLAGE =(SELECT RBJE6_ANLAGE FROM DB.RBJE6T
WHERE RBJE6_LASTUPDATE =
(SELECT MAX(RBJE6_LASTUPDATE) FROM
DB.RBJE6T
WHERE RBJE6_ANLAGE <> ‚INIT‘
)
)
, RBJE6_SQLBEZ = (SELECT RBJE6_SQLBEZ FROM DB.RBJE6T
WHERE RBJE6_LASTUPDATE =
(SELECT MAX(RBJE6_LASTUPDATE) FROM
DB.RBJE6T
WHERE RBJE6_SQLBEZ <> ‚INIT‘
)
)
WHERE RBJE6_ANLAGE = ‚INIT‘
;
END
#
— SQLZEILENR SETZEN 1 BZW MAX + 1
CREATE TRIGGER DB.RBJE6AI3
AFTER INSERT
ON DB.RBJE6T
REFERENCING NEW AS NEW
FOR EACH ROW MODE DB2SQL
WHEN (
NEW.RBJE6_SQLZEILENR = 0
)
BEGIN ATOMIC
UPDATE DB.RBJE6T
SET RBJE6_SQLZEILENR =(
SELECT MAX(RBJE6_SQLZEILENR)
+ 1
FROM DB.RBJE6T
WHERE RBJE6_LASTUPDATE =
(SELECT MAX(RBJE6_LASTUPDATE) FROM
DB.RBJE6T
WHERE RBJE6_SQLZEILENR > 0
)
)
— WHERE O.RBJE6_ANLAGE = NEW.RBJE6_ANLAGE
— AND O.RBJE6_SQLBEZ = NEW.RBJE6_SQLBEZ
WHERE RBJE6_SQLZEILENR = 0
;
END
#