我有两个使用PK / FK相互链接的表。 第一个表行可能导致第二个表中有(0到*)记录。 像客户>银行帐户。
所以我想要的是,当客户的状态更改为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;