Announcement

Collapse
No announcement yet.

PL/SQL Trigger mit aufgelöstem FK

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PL/SQL Trigger mit aufgelöstem FK

    Hallo Allerseits

    Ich wurde beauftragt mittels PL/SQL Tabellen zu loggen. Also sobald ein Insert, Update, Delete auf einer Tabelle X gemacht wird, wird ein Eintrag in X_LOG gemacht.

    Auf meiner Haupttabelle habe ich nun Foreign Keys erfasst. In der Log-Tabelle möchte ich nun in einem Attribut den FK loggen und in einem Zweiten aber auch der aufgelöste Wert aus der Referenz-Tabelle.

    CREATE TABLE PL_CLASS (
    PLCL_ID NUMBER (11),
    PLCL_CODE VARCHAR2 (15),
    PLCL_DESC VARCHAR2 (100),
    PLCL_SORT VARCHAR2 (12),
    PLCL_CCYFK NUMBER (11),
    CREATEDATE DATE,
    CREATEUSER VARCHAR2 (15),
    UPDATEDATE DATE,
    UPDATEUSER VARCHAR2 (15),
    CHANGESEQ NUMBER (11)

    Das Attribut PLCL_CCYFK hat einen Foreign Key auf das Attribut ASCR_ID in der Tabelle AS_CCY.

    CREATE TABLE AS_CCY (
    ASCR_ID NUMBER (11),
    ASCR_CODE VARCHAR2 (15),
    ASCR_DESC VARCHAR2 (100),
    ..
    ..usw.

    Ich habe nun einen Trigger auf PL_CLASS. Bei jeder Modifikation in PL_CLASS wird ein Eintrag in PL_CLASS_LOG gemacht.

    CREATE TABLE PL_CLASS_LOG (
    PLCL_ID NUMBER (11),
    PLCL_CODE VARCHAR2 (15),
    PLCL_DESC VARCHAR2 (100),
    PLCL_SORT VARCHAR2 (12),
    PLCL_CCYFK NUMBER (11),
    PLCL_CCY VARCHAR (15),
    CREATEDATE DATE,
    CREATEUSER VARCHAR2 (15),
    UPDATEDATE DATE,
    UPDATEUSER VARCHAR2 (15),
    CHANGESEQ NUMBER (11)

    Ich möchte nun im Attribut PLCL_CCY nicht die ID von AS_CCY (die habe ich schon in PLCL_CCYFK), sondern den CODE aus AS_CCY (natürlich jener zu der entsprechenden ID).

    Ist es irgendwie möglich, innerhalb des Triggers diese Auflösung vorzunehmen, oder was kann man da machen? Mein Trigger sieht mal so aus:

    CREATE OR REPLACE TRIGGER PL_CLASS_LOGGING
    AFTER INSERT
    ON PL_CLASS
    FOR EACH ROW
    BEGIN
    IF INSERTING THEN
    INSERT INTO PL_CLASS_LOG(
    PLCL_ID,
    PLCL_CODE,
    PLCL_DESC,
    PLCL_SORT,
    PLCL_CCYFK,
    PLCL_CCY,
    CREATEDATE,
    CREATEUSER,
    UPDATEUSER,
    CHANGESEQ,
    VALUES(
    :NEW.PLCL_ID,
    :NEW.PLCL_CODE,
    :NEW.PLCL_DESC,
    :NEW.PLCL_SORT,
    :NEW.PLCL_CCYFK,
    ????,
    :NEW.CREATEDATE,
    :NEW.CREATEUSER,
    :NEW.UPDATEUSER,
    :NEW.CHANGESEQ);
    END IF;
    END PL_CLASS_LOGGING;


    Vielen Dank für eure Hilfe…
    mfg

  • #2
    Hi,

    du kannst innerhalb deines Triggers alles machen was PL/SQL zu bieten hat, solange Du in dem Row Level Trigger nicht auf die eigene Tabelle zugreifst.

    Wenn Du zu einer ID aus der anderen Tabelle etwas lesen möchtest, dann mach einfach einen entsprechenden SELECT ... INTO variable drauf.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Hi

      Danke für deine Antwort. Muss ich dazu die Variable deklarieren, oder reicht das Statement aus?

      sorry, bin noch nicht so versiert mit PL/SQL...

      Merci

      Comment


      • #4
        Du musst sie deklarieren:
        Code:
        CREATE OR REPLACE TRIGGER PL_CLASS_LOGGING
        AFTER INSERT
        ON PL_CLASS
        FOR EACH ROW
        DECLARE
         l_variable1 VARCHAR2(10);
         l_variable2 NUMBER;
        BEGIN
        ...
        Dim
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          ...alles klar! Vielen Dank, funktioniert wunderbar...

          Viele Grüsse

          Comment

          Working...
          X