我正在寻找更有效的方法来循环PLSQL。
要求:想象一下我有BudgetTable& RuleSet表。 规则集看起来像这样:
acc | loc | proj || rule1 | tag1 | prio
A1% | L1% | P2% || direct | all | 90
A12% | L12% | P23% || spread | alloc | 50
前3列是下面的BudgetTable键的where子句,并存储其余的列..
A123 | L123 | P234
A199 | L199 | P299
并为每次循环迭代选取记录
loop1 :( A1%| L1%| P2%|| direct | all | 90)
A123 | L123 | P234 || direct | all | 90
A199 | L199 | P299 || direct | all | 90
loop2 :( A12%| L12%| P22%|| spread | alloc | 50)
A123 | L123 | P234 || spread | alloc | 50
我通过迭代RuleSet表完成了最直接的方式。
(pseudocodes)
FOR r in (select acc,loc,proj,rule1,tag1,prio from RuleSet)
LOOP
INSERT INTO ResultTable
select [columns, rule, tag1,prio ]
from BudgetTable
where acc like r.acc
and loc like r.loc
and proj like r.proj
;
END LOOP;
我正在寻找更好的方法来做到这一点。问题是RuleSet可以包含几千个规则,所以迭代通过&逐个匹配记录可能很长。我想知道是否有可能打破几个并行流中的循环&同时运行它们.. 感谢您的投入..
答案 0 :(得分:4)
使用简单的INSERT + SELECT + JOIN,它应该比你的循环快30~50倍:
INSERT INTO ResultTable
SELECT b.columns, b.rule, b.tag1,prio
FROM BudgetTable b
JOIN RuleSet r
ON b.acc like r.acc
and b.loc like r.loc
and b.proj like r.proj
答案 1 :(得分:2)
也许你根本不需要循环:
INSERT INTO ResultTable
select [columns, rule, tag1,prio ]
from BudgetTable bt
cross join RuleSet rs
where bt.acc like rs.acc
and bt.loc like rs.loc
and bt.proj like rs.proj
;