pl/sql实现排列组合(非递归)

项目中有时候需要随机条件的组合来做分析,排列组合可以保证不遗漏什么条件,下面是一个用pl / sql 实现的排列组合. 

 1 procedure zuhe(n      number,
 2                    arrvar out t_arrchar) is
 3     idx number;
 4     m   number;
 5     x   number := 1;
 6     type arrayty is table of number index by binary_integer;
 7     -- nlarr nlarrarty;
 8     -- arr arrayty;
 9     p    arrayty;
10     a    arrayty;
11     tmps varchar2(1000);
12   begin
13     for i in 1 .. n
14     loop
15       a(i) := i;
16     end loop;
17     for i in 1 .. n
18     loop
19       p(i) := i;
20     end loop;
21     for i in 0 .. n
22     loop
23       m := i;
24       begin
25         idx := 1;
26         p(idx) := 1; --//取第一个元素
27         while (true)
28         loop
29           if (p(idx) > n) then
30             --//取到底了,回退
31             if (idx = 1) then
32               --//各种情况取完了,不能再回退了
33               exit;
34             end if;
35             --}
36             idx := idx - 1; --;//回退到前一个
37             p(idx) := p(idx) + 1; --//替换元素        
38             --   }
39           elsif (idx = m) then
40             --//取够了,输出
41             for i in 1 .. m
42             loop
43               tmps := tmps || to_char(a(p(i)));
44             end loop;
45             arrvar(x) := tmps;
46             tmps := null;
47             p(idx) := p(idx) + 1; --//替换元素    
48             x := x + 1;
49           else
50             --{//多取一个元素
51             idx := idx + 1;
52             p(idx) := p(idx - 1) + 1;
53             --}
54           end if;
55         end loop;
56       end;
57     end loop;
58     /*  for i in 1 .. arrvar.count
59     loop
60     dbms_output.put_line(to_char(arrvar(i)));
61     end loop;*/
62   end;
原文地址:https://www.cnblogs.com/wangxingc/p/5181076.html