触发器中的大容量收集

jdzmm42g  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(186)

我需要创建一个触发器,根据另一个表中发生的事务更新表中的列。有没有一种方法可以在连接两个表时使用批量收集?
我需要多次收集数据,是否可以在另一个批量收集中使用批量收集?
这是我现有的触发器

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;

我需要把这段代码作为我的主外循环来遍历所有的数字。但我不确定怎么做。请帮忙。

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;

谢谢您!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题