PLSQL中更高效的循环

时间:2016-07-05 14:19:37

标签: oracle loops plsql

我正在寻找更有效的方法来循环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;

我正在寻找更好的方法来做到这一点。问题是Rul​​eSet可以包含几千个规则,所以迭代通过&逐个匹配记录可能很长。我想知道是否有可能打破几个并行流中的循环&同时运行它们.. 感谢您的投入..

2 个答案:

答案 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
  ;