BULK COLLECT в триггере - PullRequest
       41

BULK COLLECT в триггере

0 голосов
/ 05 августа 2020

Мне нужно создать триггер, который обновляет столбец в таблице на основе транзакции, которая происходит в другой таблице. Есть ли способ использовать BULK COLLECT для объединения двух таблиц?

Мне нужно собирать данные несколько раз, можно ли использовать BULK COLLECT в другом BULK COLLECT?

Вот мой существующий триггер

create or replace trigger trans_hist_trg
AFTER  INSERT OR UPDATE OF reason ON transaction_history
FOR EACH ROW
DECLARE     

    v_exists   VARCHAR2(1);
    v_valid   code.valid_code%TYPE;
    v_person_id     person.id%TYPE;
     TYPE Anumber_Type is TABLE of person.registration_number%TYPE INDEX BY binary_INTEGER;
    v_NumberList Anumber_Type;
    v_primaryAnumber    person.primary_number%TYPE;
     v_secondaryAnumber  consolidated_numbers.secondary_number%TYPE;
    v_anumber   person.registration_number%TYPE;

BEGIN
    IF(INSERTING) THEN
        v_person_id := :NEW.person_id;
    ELSE
        v_person_id := :OLD.person_id;
    END IF;
    
  BEGIN
        SELECT p.registration_number, p.primary_number, c.secondary_number INTO v_anumber, v_primaryAnumber, v_secondaryAnumber
        FROM person p
        LEFT JOIN consolidated_numbers c ON p.id = c.person_id WHERE p.id = v_person_id;
     END;
    BEGIN
        SELECT women_act INTO  v_exists
        FROM person
        WHERE id = v_person_id;
        EXCEPTION
        WHEN NO_DATA_FOUND THEN
           v_exists := NULL;
    END;
    IF v_exists IS NULL AND :NEW.type_id IN (10,20,30,40,50) THEN
        IF :NEW.reason NOT IN ('A1','B1') OR (:NEW.reason IN ('A1','B1') AND :NEW.action_date >= '01-JAN-00') THEN
           BEGIN
            SELECT valid_code INTO v_valid 
            FROM  code
            WHERE valid_code = :NEW.reason;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN
                    v_exists := null;
         END;
            IF v_valid IS NOT NULL THEN
               SELECT CASE 
                    WHEN EXISTS (SELECT 1 FROM code WHERE valid_code = v_valid)
                    THEN 'Y' ELSE 'N' END INTO v_exists FROM dual;
            END IF;
            IF v_exists = 'Y' THEN 
                select registration_number BULK COLLECT into v_NumberList 
                FROM person where (registration_number=v_primaryAnumber OR
                                    registration_number=v_anumber OR
                                     registration_number=v_secondaryAnumber OR
                                     primary_number= v_secondaryAnumber OR
                                    primary_number=v_anumber OR
                                    primary_number=v_primaryAnumber ) and (primary_number IS NOT NULL or primary_number <>'000000');
            ELSE
            select registration_number BULK COLLECT into v_NumberList 
            FROM person where (registration_number=v_primaryAnumber OR
                                registration_number=v_anumber OR
                                registration_number=v_secondaryAnumber OR
                                primary_number=v_anumber OR
                                primary_number=v_secondaryAnumber OR
                                primary_number=v_primaryAnumber OR
                                primary_number IS NULL);
            END IF;
            FOR indx IN 1 .. v_NumberList.COUNT
            LOOP
                update person set women_act = 'X' 
                where registration_number=v_NumberList(indx) and (women_act<>'X' or women_act IS NULL);
            END LOOP;
                update person set women_act = 'X'
                where registration_number=v_anumber and (women_act<>'X' or women_act IS NULL);
        END IF;
    END IF;
    
    mmm
END trans_hist_trg;

Мне нужно сделать этот блок кода моим основным внешним l oop для перебора всех чисел. Но я не знаю, как это сделать. Пожалуйста, помогите.

SELECT p.registration_number, p.primary_number, c.secondary_number INTO v_anumber, v_primaryAnumber, v_secondaryAnumber
        FROM person p
        LEFT JOIN consolidated_numbers c ON p.id = c.person_id WHERE p.id = v_person_id;

Спасибо!

...