Clobs triggern bei einen 'BEFORE INSERT'

[ORACLE 8i / PL/SQL]

Hallo zusammen,
Ich habe ein Problem beim Triggern von Clob Values. Es wird von einen PHP-Applikation folgende zwei erfolgreiche Querys an die Oracle abgesetzt:

NSERT INTO sessions (expiry, data, sesskey) VALUES (1105533073, empty_clob(), 399bad7060dea8e53027d4c485f31015b8’)

UPDATE sessions set data=EMPTY_CLOB() WHERE sesskey=bad7060dea8e53027d4c485f31015b8’ RETURNING data INTO :blob

Diese Querys erzeugen auf jedenfall Datensätze in der Oracle.

Ich habe versucht den folgenden Trigger einzusetzen um die ClobValues
zu Triggern, sehr wichtig ist hierbei, das der Trigger beim „BEFORE INSERTT
OR UPDATE“ abgesetzt wird.

CREATE OR REPLACE TRIGGER mak_sess_trigger_clob
BEFORE INSERT OR UPDATE ON sessions
FOR EACH ROW
declare
bob CLOB;
BEGIN
INSERT INTO mak_sess_blobs VALUES (seq_mak_sess_blobs.nextval, :NEW.sesskey, 0, EMPTY_CLOB() );
UPDATE mak_sess_blobs set data=bob, update_id = seq_mak_sess_blobs.currval WHERE id = (SELECT MAX(id) from mak_sess_blobs) RETURNING :New.data INTO bob;
END;

Leider landen aber keine Daten in den CLOB Feld

ID DBMS_LOB.GETLENGTH(DATA)


632
633
634
635
636

Wir würdet Ihr den Trigger aufbauen oder was ist falsch an den Trigger.
Vielen Dank schonmal im voraus…

Hallo mak!

Mir ist leider nicht ganz klar geworden, was deine Statements bewirken sollen… Ich versuch mich mal schrittweise vorzuarbeiten.

INSERT INTO sessions (expiry, data, sesskey) VALUES
(1105533073, empty_clob(),
399bad7060dea8e53027d4c485f31015b8’)

Du legst also in „sessions“ eine neue Row an, mit einem leeren CLOB (weil’s ja - aus unerfindlichen Gründen - Oracle nicht anders erlaubt).

UPDATE sessions set data=EMPTY_CLOB() WHERE
sesskey=bad7060dea8e53027d4c485f31015b8’ RETURNING data INTO :blob

Jetzt setzt du den CLOB einer anderen(!?) Row auch auf einen leeren Clob und speicherst dir diesen in :blob ab…(???)

Diese Querys erzeugen auf jedenfall Datensätze in der Oracle.

Das zweite Statement schon, das erste ändert bestehende Daten (und zwar schmeisst es dort den evtl. bestehenden CLOB weg).

Ich habe versucht den folgenden Trigger einzusetzen um die
ClobValues
zu Triggern, sehr wichtig ist hierbei, das der Trigger beim
„BEFORE INSERTT
OR UPDATE“ abgesetzt wird.

Was soll der Trigger bewirken?

CREATE OR REPLACE TRIGGER mak_sess_trigger_clob
BEFORE INSERT OR UPDATE ON sessions
FOR EACH ROW
declare
bob CLOB;
BEGIN
INSERT INTO mak_sess_blobs VALUES
(seq_mak_sess_blobs.nextval, :NEW.sesskey, 0, EMPTY_CLOB() );

Wir schreiben also auch in mak_sess einen neuen Satz mit einem leeren CLOB.

UPDATE mak_sess_blobs set data=bob, update_id =
seq_mak_sess_blobs.currval WHERE id = (SELECT MAX(id) from
mak_sess_blobs) RETURNING :New.data INTO bob;

Wir setzen den CLOB von (irgendeiner?) Row in mak_sess auf den leeren CLOB „bob“ und holen uns den CLOB aus dem triggernden Statement danach in die Variable „bob“ (um dann nichts mehr weiter damit zu tun…).

END;

Leider landen aber keine Daten in den CLOB Feld

Das kommt daher, weil du nirgendwo etwas anderes als EMPTY_CLOBs erzeugst (zumindest hast du uns das unterschlagen).

Wir würdet Ihr den Trigger aufbauen oder was ist falsch an den
Trigger.

Vielleicht solltest du mal erklären, was du genau vorhast, ich werde aus dem hier einfach nicht schlau.

Gruß
Martin