如何在存储过程中从另一个表更新表的列值?

时间:2019-05-11 08:10:24

标签: sql oracle plsql duplicates procedure

我通过查询其他表(包括交易记录tbl)创建了一个过程,以结算所有交易记录,并在记录上自动加上参考号和日期。

我想做的是我的settle_transaction过程需要从选定的语句生成查询并将其插入结算表。同时,我还需要{_1}} ref_num和已处理日期作为事务表的“戳记”,以便在再次调用该过程时没有重复的结算。否则,我不知道如何停止两次显示相同的结算数据

以下是输出结算tbl和结构类似的程序:

update

输出:

BEGIN
    for r_client in 
    (
        select clientid,
        client_name, sum(transaction) total_amount
        from transaction_tbl tran join terminal_tbl term
        on tran.terminalid = term.terminalid join client_tbl c on c.clientid = term.clientid
        where refnr is null
    )
    loop
    v_refnr := get_refnr;
        insert into settlement_tbl
        (
            Ref_Num, 
            Total,
            CLIENTID,
            TITLE, 
            processeddate
        )
        values (v_refnr, total_amount, clientid,
        name,sysdate);
update_refnr(v_refnr, sysdate)
        end loop;
END

当我执行上述过程时,它将填充来自select查询的所有结果。但是,如果我再次执行,它将复制相同的结果,尤其是总金额。

我正在寻找一种解决方案,将另一个过程/功能放入此结算过程中,以防止此过程中所选查询的重复记录。

我使用| reference_num | total amount | client id | client name | processed_date | |---------------|--------------|-----------|-------------|----------------| ref. no#将现有的参考编号和日期更新为下面显示的事务tbl。

process_date

这是我放入结算程序中的尝试代码,但仍显示重复的记录,并且无法更新到事务tbl。

| transaction_num | transaction amount | reference_num | processed_date |
|-----------------|--------------------|---------------|----------------|

我也尝试了其他SQL reference,但无法编译。

理想情况下,从存储过程中检索每条记录时,结算tbl中没有重复的记录。

1 个答案:

答案 0 :(得分:1)

您仅想在表中不存在新数据时才将其插入。正如其他人所说,您可以使用MERGE来做到这一点:

BEGIN
  for r_client in (select clientid,
                          client_name,
                          sum(transaction) total_amount
                     from transaction_tbl tran
                     join terminal_tbl term
                       on tran.terminalid = term.terminalid
                     join client_tbl c
                       on c.clientid = term.clientid
                     where refnr is null)
  loop
    v_refnr := get_refnr;

    MERGE INTO settlement_tbl s
      USING (SELECT v_refnr      AS REF_NUM,
                    total_amount AS TOTAL,
                    clientid     AS CLIENTID,
                    name         AS TITLE,
                    SYSDATE      AS PROCESSEDDATE
               FROM DUAL) d
        ON (s.REF_NUM = d.REF_NUM)
      WHEN NOT MATCHED THEN
        INSERT (Ref_Num,   Total,   CLIENTID,   TITLE,   processeddate)
        VALUES (d.REF_NUM, d.TOTAL, d.CLIENTID, d.TITLE, d.PROCESSEDDATE);

    update_refnr(v_refnr, sysdate);
  END LOOP;
END;

WHEN NOT MATCHED在表中不存在v_refnr时插入新数据。

好运。