Zamiana triggera w procedure

Odpowiedz Nowy wątek
2011-09-12 10:01
0

Witajcie,
jestem dosyć poczatkujący, aczkolwiek rzucony od razu na glebokie wody. Musze zreprodukowac proces polegajacy na exporcie niektórych danych z jednej tabeli do drugiej. Muszę zatem wyciąć ciało triggera i opakowac je w procedure. Import jest z tabeli rating do tabeli xtexport_table_1 . Mam prośbe o sugestie, i podpowiedzi dotyczące składni zbudowania takiej proceury.

Sam doszedłem do tego że wszystkie warunkowe opcje triggera 'IF INSERTING', 'ELSIF UPDATING' powienienem usunąć, jednoczesnie potem w składni 'INSERT INTO', powinienem wmontować 'SELECT' zaciągającego dane z tabeli rating.

Powodzenia w łamigłówce i stokrotne dzięki z góry za support ;)

create or replace
TRIGGER TRG_RATING_EXP_DLS
BEFORE DELETE OR UPDATE OR INSERT
OF RATING_ID,EXTERNAL_ID_1,DN_RATING_ATTRIBUTE_ID,ALIGNMENT_ID,TEAM_ID,CUSTOMER_ID,AFFILIATION_ID,PRODUCT_ID,PERIOD_ID,VALUE_MIN,VALUE_MAX,TENANT_ID,USER_ACCOUNT_ID
ON RATING
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
    nOperation XTEXPORT_TABLE_1.OPERATION%TYPE  := 0;
    nSchemaId XTEXPORT_TABLE_1.SCHEMA_ID%TYPE   := 3600;
    nParentTag XTEXPORT_TABLE_1.PARENT_TAG%TYPE := -1;
    nChildTag XTEXPORT_TABLE_1.CHILD_TAG%TYPE   := 3600;
    nExportStatus XTEXPORT_TABLE_1.STATUS%TYPE  := 0;
    vcTransactionId XTEXPORT_TABLE_1.DBMSTRANSACTION_ID%TYPE := DBMS_TRANSACTION.LOCAL_TRANSACTION_ID;

    --Fields to be exported are
    nRatingId               RATING.RATING_ID%TYPE := NULL;
    nDnRatingAttributeId    RATING.DN_RATING_ATTRIBUTE_ID%TYPE := NULL;
    nPeriodId               RATING.PERIOD_ID%TYPE := NULL;
    nTeamId                 RATING.TEAM_ID%TYPE := NULL;
    nAlignmentId            RATING.ALIGNMENT_ID%TYPE := NULL;
    nCustomerId             RATING.CUSTOMER_ID%TYPE := NULL;
    nAffiliationId          RATING.AFFILIATION_ID%TYPE := NULL;
    nProductId              RATING.PRODUCT_ID%TYPE := NULL;
    vcValuMax               RATING.VALUE_MAX%TYPE := NULL;
    vcValuMin               RATING.VALUE_MIN%TYPE := NULL;
    vcExternalId_1          RATING.EXTERNAL_ID_1%TYPE := NULL;
    nUserAccountId          RATING.USER_ACCOUNT_ID%TYPE :=NULL;
    iTenantID               NUMBER (16);
    vcPeriodIdNULL          varchar2(10):= NULL;
    vcTeamIdNULL            varchar2(10):= NULL;
    vcAlignmentIdNULL       varchar2(10):= NULL;
    vcAffiliationIdNULL     varchar2(10):= NULL;
    vcProductIdNULL         varchar2(10):= NULL;
    vcUserAccountIdNULL     varchar2(10):= NULL;
BEGIN

    IF (Xtelligent.DI_fnRPLUser(USER) = TRUE OR Xtelligent.DI_fnIDLUser(USER) = TRUE) THEN
        RETURN;
    END IF;
    IF (TENANT_PKG.TriggersEnabled ('XTDE') = 0 ) THEN
        RETURN;
    END IF;

    IF INSERTING THEN

        IF (:NEW.EXTERNAL_ID_1 IS NULL) THEN
            :NEW.EXTERNAL_ID_1 :=:NEW.RATING_ID;
            vcExternalId_1 := :NEW.RATING_ID;
        ELSE
            vcExternalId_1 := :NEW.EXTERNAL_ID_1;
        END IF;

        IF (:NEW.GLOBAL_RATING_ID IS NULL) THEN
            SELECT SEQ_IS_GLOBAL_IDENTIFIER.NEXTVAL INTO :NEW.GLOBAL_RATING_ID FROM dual;
        END IF;

        nOperation              := 1;
        nRatingId               := :NEW.RATING_ID;
        nDnRatingAttributeId    := :NEW.DN_RATING_ATTRIBUTE_ID;
        nPeriodId               := :NEW.PERIOD_ID;
        nTeamId                 := :NEW.TEAM_ID;
        nAlignmentId            := :NEW.ALIGNMENT_ID;
        nCustomerId             := :NEW.CUSTOMER_ID;
        nAffiliationId          := :NEW.AFFILIATION_ID;
        nProductId              := :NEW.PRODUCT_ID;
        vcValuMax               := :NEW.VALUE_MAX;
        vcValuMin               := :NEW.VALUE_MIN;
        iTenantID               := :NEW.TENANT_ID;
        nUserAccountId          := :NEW.USER_ACCOUNT_ID;
    ELSIF UPDATING THEN

        IF (:NEW.EXTERNAL_ID_1 IS NULL) THEN
            :NEW.EXTERNAL_ID_1 :=:NEW.RATING_ID;
            vcExternalId_1 := :NEW.RATING_ID;
        ELSE
            vcExternalId_1 := :NEW.EXTERNAL_ID_1;
        END IF;

        nOperation := 0;    -- update request 0
        nRatingId := :NEW.RATING_ID;
        nDnRatingAttributeId := :NEW.DN_RATING_ATTRIBUTE_ID;
        nCustomerId := :NEW.CUSTOMER_ID;
        iTenantID := :NEW.TENANT_ID;

        IF (:NEW.PERIOD_ID is NULL and :OLD.PERIOD_ID is NOT NULL) THEN
            vcPeriodIdNULL :='$$$$';
        ELSE
            nPeriodId := :NEW.PERIOD_ID;
        END IF;
        IF (:NEW.TEAM_ID is NULL and :OLD.TEAM_ID is NOT NULL) THEN
            vcTeamIdNULL :='$$$$';
        ELSE
            nTeamId := :NEW.TEAM_ID;
        END IF;

        IF (:NEW.ALIGNMENT_ID is NULL and :OLD.ALIGNMENT_ID is NOT NULL) THEN
            vcAlignmentIdNULL :='$$$$';
        ELSE
            nAlignmentId := :NEW.ALIGNMENT_ID;
        END IF;

        IF (:NEW.AFFILIATION_ID is NULL and :OLD.AFFILIATION_ID is NOT NULL) THEN
            vcAffiliationIdNULL :='$$$$';
        ELSE
            nAffiliationId := :NEW.AFFILIATION_ID;
        END IF;

        IF (:NEW.PRODUCT_ID is NULL and :OLD.PRODUCT_ID is NOT NULL) THEN
            vcProductIdNULL :='$$$$';
        ELSE
            nProductId := :NEW.PRODUCT_ID;
        END IF;

        IF (:NEW.VALUE_MAX is NULL and :OLD.VALUE_MAX is NOT NULL) THEN
            vcValuMax :='$$$$';
        ELSE
            vcValuMax := :NEW.VALUE_MAX;
        END IF;
        IF (:NEW.VALUE_MIN is NULL and :OLD.VALUE_MIN is NOT NULL) THEN
            vcValuMin :='$$$$';
        ELSE
            vcValuMin := :NEW.VALUE_MIN;
        END IF;

        IF (:NEW.USER_ACCOUNT_ID is NULL and :OLD.USER_ACCOUNT_ID is NOT NULL) THEN
            vcUserAccountIdNULL :='$$$$';
        ELSE
            nUserAccountId := :NEW.USER_ACCOUNT_ID;
        END IF;

    ELSIF DELETING THEN

        nOperation              := -2;-- delete request -2
        nRatingId               := :OLD.RATING_ID;
        nDnRatingAttributeId    := :OLD.DN_RATING_ATTRIBUTE_ID;
        nPeriodId               := :OLD.PERIOD_ID;
        nTeamId                 := :OLD.TEAM_ID;
        nAlignmentId            := :OLD.ALIGNMENT_ID;
        nCustomerId             := :OLD.CUSTOMER_ID;
        nAffiliationId          := :OLD.AFFILIATION_ID;
        nProductId              := :OLD.PRODUCT_ID;
        vcValuMax               := :OLD.VALUE_MAX;
        vcValuMin               := :OLD.VALUE_MIN;
        iTenantID               := :OLD.TENANT_ID;
        nUserAccountId          := :OLD.USER_ACCOUNT_ID;
        IF (:OLD.EXTERNAL_ID_1 IS NULL) THEN
            vcExternalId_1 := :OLD.RATING_ID;
        ELSE
             vcExternalId_1 := :OLD.EXTERNAL_ID_1;
        END IF;

    END IF;

    INSERT INTO XTEXPORT_TABLE_1
    (
        XTEXPORT_ID,
        SCHEMA_ID,
        OPERATION,
        PARENT_TAG,
        CHILD_TAG,
        STATUS,
        TIME_STAMP,
        DBMSTRANSACTION_ID,
        KEY_1,
        IDENTIFIER_1,
        IDENTIFIER_2,
        IDENTIFIER_3,
        IDENTIFIER_4,
        IDENTIFIER_5,
        IDENTIFIER_6,
        IDENTIFIER_7,
        STRING_1,
        STRING_2,
        IDENTIFIER_8,
        CODE_1,
        CODE_2,
        CODE_3,
        CODE_4,
        CODE_5,
        CODE_6,
        TENANT_ID
    )
    VALUES
    (
        XTEXPORT_ID_SEQ.NEXTVAL,
        nSchemaId,
        nOperation,
        nParentTag,
        nChildTag,
        nExportStatus,
        SYSDATE,
        vcTransactionId,
        vcExternalId_1,
        nDnRatingAttributeId,
        nPeriodId,
        nTeamId,
        nAlignmentId,
        nCustomerId,
        nAffiliationId,
        nProductId,
        vcValuMin,
        vcValuMax,
        nUserAccountId,
        vcPeriodIdNULL,
        vcTeamIdNULL,
        vcAlignmentIdNULL,
        vcAffiliationIdNULL,
        vcProductIdNULL,
        vcUserAccountIdNULL,
        iTenantID
    );

END TRG_RATING_EXP_DLS;

-------------------

“Don't play what's there, play what's not there.”
Miles Davis
edytowany 1x, ostatnio: madmike, 2011-09-12 19:43

Pozostało 580 znaków

2011-09-12 10:27
0

Nie wiem, czy wycinanie IF'ów jest dobrym pomysłem. Nie mam czasu na analizę całego triggera, ale już na pierwszy rzut oka widać, że trochę inne rzeczy dzieją się przy INSERT, niż przy UPDATE, a jeszcze inne przy DELETE - być może Ciebie z założenia powinien interesować tylko jeden z tych przypadków.

Ja bym zrobił procedurę z trzema parametrami: stary_rekord rating%rowtype, nowy_rekord rating%rowtype, typ_operacji char.
Potem zamiast pisać np. :OLD.PERIOD_ID piszesz stary_rekord.PERIOD_ID. Ewentualnie commita można dodać po insercie, bo w triggerze go nie mogło być. Ale to jak wolisz - możesz commitować zewnętrznie - ręcznie, w nadrzędnej procedurze, w języku z którego wołasz ten kod itp.

Pozostało 580 znaków

2011-09-12 10:39
0

Ale chodzi o to że ten trigger jest wywołany przez te zmiany: INSERT, UPDATE czy DELETE. A ja chcę zbudować taką procedurę która tylko wyciągnie mi dane z jednej tabeli i wyeksportuje do drugiej. Problem w tym, że nie wiem jak powinna wyglądać prawidłowa składnia, ponadto w nowej tabeli (xtexport..) są wypełniane inne kolumny dla których wcześniej deklarowane są pewne wartości, z którymi tez mam problem.

Ale dzięki za respond ;)


-------------------

“Don't play what's there, play what's not there.”
Miles Davis

Pozostało 580 znaków

2011-09-12 11:34
0

napisz najpierw selecta, który wyciągnie Ci dokładnie te dane, które chcesz zapisać do nowej tabeli. Jak to zrobisz to potem będzie z górki


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-09-12 11:41
0

Jestem totalnie nieogarnięty jeżeli chodzi o te zmienne złożone. Próbowałem zmontować coś takiegom ale niestety nie bangla(complied with errorrs, których nie pokazuje):

create or replace
procedure procedura_testowa

is

begin

    nOperation kopia_xtexport_table_1 .OPERATION%TYPE   := 0;
    nSchemaId kopia_xtexport_table_1 .SCHEMA_ID%TYPE    := 3600;
    nParentTag kopia_xtexport_table_1 .PARENT_TAG%TYPE  := -1;
    nChildTag kopia_xtexport_table_1 .CHILD_TAG%TYPE    := 3600;
    nExportStatus kopia_xtexport_table_1 .STATUS%TYPE   := 0;
    vcTransactionId kopia_xtexport_table_1 .DBMSTRANSACTION_ID%TYPE := DBMS_TRANSACTION.LOCAL_TRANSACTION_ID;

    --Fields to be exported are
    nRatingId               RATING.RATING_ID%TYPE := NULL;
    nDnRatingAttributeId    RATING.DN_RATING_ATTRIBUTE_ID%TYPE := NULL;
    nPeriodId               RATING.PERIOD_ID%TYPE := NULL;
    nTeamId                 RATING.TEAM_ID%TYPE := NULL;
    nAlignmentId            RATING.ALIGNMENT_ID%TYPE := NULL;
    nCustomerId             RATING.CUSTOMER_ID%TYPE := NULL;
    nAffiliationId          RATING.AFFILIATION_ID%TYPE := NULL;
    nProductId              RATING.PRODUCT_ID%TYPE := NULL;
    vcValuMax               RATING.VALUE_MAX%TYPE := NULL;
    vcValuMin               RATING.VALUE_MIN%TYPE := NULL;
    vcExternalId_1          RATING.EXTERNAL_ID_1%TYPE := NULL;
    nUserAccountId          RATING.USER_ACCOUNT_ID%TYPE :=NULL;
    iTenantID               NUMBER (16);
    vcPeriodIdNULL          varchar2(10):= NULL;
    vcTeamIdNULL            varchar2(10):= NULL;
    vcAlignmentIdNULL       varchar2(10):= NULL;
    vcAffiliationIdNULL     varchar2(10):= NULL;
    vcProductIdNULL         varchar2(10):= NULL,
    vcUserAccountIdNULL     varchar2(10):= NULL

INSERT INTO kopia_xtexport_table_1 (
        XTEXPORT_ID,
        SCHEMA_ID,
        OPERATION,
        PARENT_TAG,
        CHILD_TAG,
        STATUS,
        TIME_STAMP,
        DBMSTRANSACTION_ID,
        KEY_1,
        IDENTIFIER_1,
        IDENTIFIER_2,
        IDENTIFIER_3,
        IDENTIFIER_4,
        IDENTIFIER_5,
        IDENTIFIER_6,
        IDENTIFIER_7,
        STRING_1,
        STRING_2,
        IDENTIFIER_8,
        CODE_1,
        CODE_2,
        CODE_3,
        CODE_4,
        CODE_5,
        CODE_6,
        TENANT_ID
    )

    VALUES

    (
        XTEXPORT_ID_SEQ.NEXTVAL,
        nSchemaId,
        nOperation,
        nParentTag,
        nChildTag,
        nExportStatus,
        SYSDATE,
        DBMSTRANSACTION_ID_seq.nextval,
    (SELECT
    External_id_1,
    dn_rating_attribute_id,
    period_id,
    team_id,
    alignment_id,
    customer_id,
    affiliation_id,
    product_id,
    value_min,
    value_max,
    user_account_id FROM rating),
    vcPeriodIdNULL,
        vcTeamIdNULL,
        vcAlignmentIdNULL,
        vcAffiliationIdNULL,
        vcProductIdNULL,
        vcUserAccountIdNULL,
    (SELECT tenant_id FROM rating)

        )
    end 
    ;

-------------------

“Don't play what's there, play what's not there.”
Miles Davis
edytowany 4x, ostatnio: madmike, 2011-09-12 19:43
1. Zmienne się deklaruje pomiędzy IS a BEGIN - stąd błąd. 2. Po grzyba ta procedura, skoro, tylko jeden insert w niej robisz? Możesz go sobie po prostu na boku odpalić. 3. Aaa... błąd jeszcze dlatego, że INSERT źle napisany. Jak chcesz zrobić insert z selecta, to nie może być sekcji values, tylko INSERT INTO tabela (pola) select ... - scovron 2011-09-13 09:08

Pozostało 580 znaków

2011-09-12 11:57
0
Misiekd napisał(a)

napisz najpierw selecta, który wyciągnie Ci dokładnie te dane, które chcesz zapisać do nowej tabeli. Jak to zrobisz to potem będzie z górki


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
w klauzulu INSERT INTO są wyszczególnione wszystkie kolumny z docelowej tabeli, a potem w VALUES są source fieldy - ale to pewnie wiesz, ale jak popatrzysz tam właśnie są SELECTY o pola które mnie interesują.<br /> (SELECT External_id_1, dn_rating_attribute_id, period_id, team_id, alignment_id, customer_id, affiliation_id, product_id, value_min, value_max, user_account_id FROM rating) i (SELECT tenant_id FROM rating) - matulaspox 2011-09-12 12:06

Pozostało 580 znaków

2011-09-12 12:30
0

no ale w czym masz problem bo ja cały czas nie wiem. Jak masz selecta, który zwraca Ci WSZYSTKO to co chcesz to co za problem napisać

INSERT INTO dupa(dupa_1, dupa_2, dupa_n) SELECT i_tutaj_pola_które_już_masz FROM tabela_z_której_ma_to_być

i to CAŁA procedura. Możesz do niej przekazywać jakieś ID czy coś innego aby zawęzić wyniki selecta.

Zauważ, że te dane, które chcesz JUŻ SĄ w tabeli.


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 1x, ostatnio: Misiekd, 2011-09-12 12:32

Pozostało 580 znaków

2011-09-13 09:16
0

Dzięki Scovron, Misiekd za rady (pomocne) i Madmike za correcte :) ogarnąłem budując poprawną składnię i pozbywając się tych zmiennych wmontowywując je w SELECTA.

Pozdrówki, zamykam temat


-------------------

“Don't play what's there, play what's not there.”
Miles Davis

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0