У меня есть две таблицы, которые связаны между собой с помощью 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;