HT обновить записи в ссылочной таблице? | СОЕДИНИТЕЛЬНЫЙ ТРИГГЕР | Проблема с использованием коллекций - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть две таблицы, которые связаны между собой с помощью PK / FK. 1-я строка таблицы может привести к (от 0 до *) записям во 2-й таблице. Как клиент> банковский счет.

Итак, я хочу, чтобы при изменении состояния клиента на 2 (неактивное) все его учетные записи должны быть закрыты (также установлено неактивное).

Я не знаю, каков наилучший способ сделать это, но я пытаюсь решить его, используя COMPOUND TRIGGER, и он выдает мне ошибку PLS-00642: локальные типы коллекций не допускаются в инструкциях SQL.

Проблема, с которой я столкнулся на данный момент, связана с использованием коллекций. Я хочу обновить состояние счетов для всех затронутых клиентов. Любые альтернативные решения высоко ценятся.

Я могу попытаться описать мою идею в коде JS:

// declaration
var collection_of_records;
// before statement block
collection_of_records = [];
// end of before statement
// before update for each row block
for (row in table1) {
    if (row.state_type_1 == 2) {
        collection_of_records.push(row.id);
    }
}
// end of before update
// after statement block
table2
.filter((row) => {
    return collection_of_records.contains(row.parent_id);
})
.forEach((row) => {
    var idx = table2.indexOf(row);
    row.state_type_2 = 2;
    table2[idx] = row;
});
// end of after statement block

Вот мой код PL / SQL:

CREATE OR REPLACE TRIGGER T186121_T_UPDT_PKOHT_MT_AKTVN
    FOR UPDATE OF PARKLA_SL_KOOD ON T186121_PARKLA
    COMPOUND TRIGGER
        TYPE P_KOOD IS TABLE OF T186121_PARKLA.PARKLA_KOOD%TYPE;
        PARKLAD P_KOOD;
    BEFORE STATEMENT IS
    BEGIN
        PARKLAD := P_KOOD(); -- init
    END BEFORE STATEMENT;
    BEFORE EACH ROW IS
    BEGIN
        IF (:NEW.PARKLA_SL_KOOD = 2) THEN
            PARKLAD.EXTEND; -- expend by 1 line
            PARKLAD(PARKLAD.LAST) := :OLD.PARKLA_KOOD; -- add ID to collection
            DBMS_OUTPUT.PUT_LINE('FIRED FOR ' || :OLD.PARKLA_KOOD);
            DBMS_OUTPUT.PUT_LINE('ARRAY LENGTH CURRENTLY IS ' || PARKLAD.COUNT);
        END IF;
    END BEFORE EACH ROW;
    AFTER STATEMENT IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('ARRAY LENGTH IS ' || PARKLAD.COUNT);
        UPDATE T186121_PKOHT SET PKOHA_SL_KOOD = 2
        WHERE PARKLA_KOOD MEMBER OF PARKLAD; -- here comes the problem.
    END AFTER STATEMENT;
END T186121_T_UPDT_PKOHT_MT_AKTVN;
...