HT更新引用表中的记录? |复合触发|使用集合的问题

时间:2018-11-08 19:10:24

标签: sql oracle oracle12c

我有两个使用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;

0 个答案:

没有答案