我通过查询其他表(包括交易记录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中没有重复的记录。
答案 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
时插入新数据。
好运。