tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
1350
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    dexit2k dexit2k ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    3
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
     
    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?!
    Geändert von dexit2k (17.02.09 um 15:27 Uhr)
     

  2. #2
    planb2000 planb2000 ist offline Mitglied Gold
    Registriert seit
    Mar 2008
    Beiträge
    133
    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
     

  3. #3
    dbwizard dbwizard ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Zürich
    Beiträge
    285
    Zitat Zitat von dexit2k Beitrag anzeigen

    .....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
     

  4. #4
    dexit2k dexit2k ist offline Grünschnabel
    Registriert seit
    Feb 2009
    Beiträge
    3
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    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;
     

Ähnliche Themen

  1. Oracle: Mit Trigger eine Java Methode aufrufen
    Von sceppi im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 22.02.08, 06:41
  2. JavaScript Funtion aufrufen
    Von cloda im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 09.10.06, 22:18
  3. [Oracle] Trigger
    Von Pherseus im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 19.12.05, 13:00
  4. Oracle Trigger für Datumgsprüfung
    Von nautiLus` im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 13.11.05, 23:20
  5. [oracle] Trigger
    Von MonkeyMan im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 04.05.04, 18:21