Oracle Insert Trigger

Biergamasda

Erfahrenes Mitglied
Hallo Leute,

folgender Sachverhalt:

Master Datenbank mit n Child Datenbanken welche über Database links angebunden sind. Ich möchte nun über einen Trigger inserts in der Master-DB auch auf die Child-DB's verteilen.

Hierzu führe ich in einer Tabelle alle Linknamen mit. Wenn ich diese auslese ist es notwendig, über "execute immediate" zu arbeiten, da diese sonst nicht aufgelöst werden. Ich möchte nun bei einem Insert einen Trigger feuern, welcher die neue Zeile auch auf die Slaves verteilt. Hierzu habe ich folgenden Code:

Code:
create or replace
TRIGGER INSERT_BOOKING 
AFTER INSERT ON BOOKING 
FOR EACH ROW 
DECLARE
  exec_string varchar2(1000);
BEGIN
  for rec in (select dblink_name as lnk from databases where dblink_name is not null) loop      
  
    exec_string := 'INSERT INTO booking@'||rec.lnk||' VALUES ('||:new.bookid||', '||:new.roomno||', '||:new.adminpass||', '||:new.userpass||', TO_TIMESTAMP("'||:new.starttime||'", "DD.MM.RR HH24:MI:SS,FF"), TO_TIMESTAMP("'||:new.endtime||'", "DD.MM.RR HH24:MI:SS,FF"), '||:new.description||', '||:new.confowner||', '||:new.adminflags||', '||:new.userflags||', '||:new.master_id||', '||:new.running_on_server||', '||:new.is_anytime||', '||:new.is_series||', TO_TIMESTAMP("'||:new.datereq||'", "DD.MM.RR HH24:MI:SS,FF"), TO_TIMESTAMP("'||:new.datemod||'", "DD.MM.RR HH24:MI:SS,FF"), '||:new.is_locked||', '||:new.region||', '||:new.site||')';
    dbms_output.put_line('executing: '||exec_string);
    execute immediate exec_string;
  end loop;
  
  COMMIT;
END;

dieser funktioniert jedoch nicht, und ich weiß nicht wieso - hierbei treten aber so und so noch Probleme mit NULL Values auf, da man diese explizit abfangen muss!!

Was ich auch versucht habe, ist folgendes:

Code:
exec_string := 'INSERT INTO booking@'||rec.lnk||' b1 SELECT * from booking b2 where b2.bookid='||:new.bookid;

wobei das auch nicht funktioniert.

Hat hier vl jemand eine Idee bzw. einen Lösungsansatz wie ich das lösen könnte?

Danke schon im Voraus

Gruß
Christoph
 
Hast du eine Fehlermeldung?

Zur Null-Problematik. NVL hilft da weiter

SQL:
SELECT NVL(NULL, 0) AS zahl FROM DUAL;
 
Zuletzt bearbeitet von einem Moderator:
das mit dem NVL ist mir schon klar, das habe ich großteils schon gelöst, es treten nur ab und zu noch Probleme mit numerischen Feldern auf, welche ich auf null setzen möchte.

die eigentliche Frage besteht eher, wieso letzerer Ansatz nicht funktioniert, bzw. ob es etwas ähnliches gibt.

Möglicherweise gibt es eine Möglichkeit über DB-Links zu iterieren ohne ein execute immediate zu verwenden?

lg
 
Zurück