Oracle trigger soll funtion aufrufen

dexit2k

Grünschnabel
Ich habe bislang nur c/java/vba programmiert und wurde gestern auf unsere datenbank losgelassen. bislang haben bei uns consultans die datenbankanpassungen gemacht, nun ist es meine neue aufgabe. ich hatte sql das letzte mal vor ca 4 jahren im studium.

zum system, es handelt sich um oracle 10g r2.
auf die datenbank(en) greife ich via sqldeveloper zu.
es gibt eine tabelle mit um die 120 spalten. geschiet auf besagte tabelle ein insert oder update, greift ein trigger ein und schreibt die werte des anzulegenden datensatzes um.

der trigger ist über 48 bildschirme lang (kein witz ). es wird 3x etwas ähnliches gemacht.
im klartext. ein artikel wird in werk a angelegt und automatisch auf alle anderen werke verteilt. das funktioniert soweit aber des ding ist unübersichtlich und es ist anzunehmen, dass noch einige werke hinzu kommen.

ich würde gern die redundanz rausnehmen, indem ich die Zuweisung der Variablen sowie das insert in ne funktion schmeiße.

der funktion möchte ich nen cursor sowie das new objekt übergeben aber genau des ist der haken.

-> geht das überhaupt, wenn ja wie ?


Code:
create or replace TRIGGER trg_tb_to_tbX
AFTER  UPDATE OR INSERT ON tb
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 

DECLARE
->120 Variablen.....


-- Verarbeitung Werk B
OPEN  tb_cursor FOR SELECT * FROM tb_WerkB
WHERE tb_artikel_nr = :NEW.tb_artikel_nr;
FETCH tb_cursor INTO tb_row;

IF    tb_cursor%NOTFOUND THEN
      
	Rabat   := :NEW.RABAT;
        ...

	IF :NEW.LAKIERUNG = ' ' THEN 
              NEW.LAKIERUNG := 'RAL2000'
              ....
        end if

        INSERT INTO tb_WerkB VALUES (....120 parameter....);
end if
close cursor

was im trigger die zeile : REFERENCING OLD AS OLD NEW AS NEW
bewirkt konnte ich leider in der funktion nicht nachstellen
deswegen die idee mit dem übergeben des new.

ist es eigentlich möglich, dass insert irgendwie mit dem new aufzurufen, ohne alle 120 parameter einzeln aufzulisten?


ps.: was mir jetzt noch eingefallen: unter welchem stichpunkt finde ich via goole etwas über dieses new. nen normaler parameter ist es ned nen objekt scheints aber auch ned zu sein?!
 
Zuletzt bearbeitet:
Hi,

ps.: was mir jetzt noch eingefallen: unter welchem stichpunkt finde ich via goole etwas über dieses new. nen normaler parameter ist es ned nen objekt scheints aber auch ned zu sein?!

:new und :old sind so genannte Pseudodatensätze, diese enthalten den alten b.z.w. den neuen Wert des Feldes auf das Du gerade zugreifst.

was im trigger die zeile : REFERENCING OLD AS OLD NEW AS NEW
bewirkt konnte ich leider in der funktion nicht nachstellen

: REFERENCING damit können die :new, :old Pseudodatensätze mit anderem Namen referenziert werden, Referencing old As gaaaaanz_alt, würde dazu führen das im Programm :gaaaaanz_alt, den Wert enthält den du z.B. updaten möchtest.

Ich hoffe es hilft dir erstmal ein wenig.

Grüße
 
.....greift ein trigger ein und schreibt die werte des anzulegenden datensatzes um.

der trigger ist über 48 bildschirme lang (kein witz ). es wird 3x etwas ähnliches gemacht.
.......

-> geht das überhaupt, wenn ja wie ?

Hallo,

Einerseits könntest du mit den Tip's von Planb2000 weiter oben etwas versuchen.
Aber ich würde mir den ganzen Ansatz doch nochmal überlegen (Übrigens,was waren DAS für Consultants, die solche Sachen machen ?)

An deiner Stelle würde ich den Trigger wegwerfen und die Logik in ein Package verlegen. Solche Sachen gehören NICHT in eine Trigger. Dort hättest du auch bessere Möglichkeiten, die Sache etwas "modularer" aufzubauen, ausserdem dürfte sie Sache deutlich besser wartbarer werden.


Gruss
 
die lösung sieht etwas anders aus als ich sie mir anfangs vorgestellt habe. das ergebnis ist aber das gleiche, von zuvor 48 Bildschirmseiten ist das ganze auf 6,5 geschrumpft:

Code:
DECLARE
     Datensatz  tb%ROWTYPE;
Beginn
      If YX then
         Datensatz.column1 = '12345'
         Datensatz.column2 = :new.column2
          .....
         Datensatz.column101 = '666'
      elseif  123 then
          .....
      else
          .....
      end if

      INSERT INTO tb VALUES Datensatz;
end


Folgender Code gab mir die Erleuchtung:

Code:
CREATE TABLE t AS SELECT table_name, tablespace_name FROM all_tables;

SELECT COUNT(*)
FROM t;

DECLARE
 trec  t%ROWTYPE;
BEGIN
  trec.table_name := 'NEW';
  trec.tablespace_name := 'NEW_TBSP';

  INSERT INTO t
  VALUES trec;

  COMMIT;
END;
 
Zurück