ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 553|回复: 11

oracle 不定嵌套数的嵌套for循环,该怎么写更好

[复制链接]
论坛徽章:
9
马上有车
日期:2014-04-16 17:19:192013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
跳转到指定楼层
1#
发表于 2018-3-7 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
线上有一个数据组合的逻辑,从15个数中,可以选择1、2、3.....15进行组合。是通过嵌套for循环实现的。从1个for循环到嵌套15个for循环。大致结构如下:


BEGIN
  IF (v_i = 3) THEN
    -- 15选3的组合
    FOR a IN 1..15 LOOP
      FOR b IN (a + 1) .. 15 LOOP
        FOR c IN (b + 1) .. 15 LOOP
        .........................................
        END LOOP;
      END LOOP;
    END LOOP;
  ELSIF (v_i = 4) THEN
    -- 15选4的组合
    FOR a IN 1..15 LOOP
      FOR b IN (a + 1) .. 15 LOOP
        FOR c IN (b + 1) .. 15 LOOP
          FOR d IN (c + 1) .. 15 LOOP
               .........................................
          END LOOP;
        END LOOP;
      END LOOP;
    END LOOP;
  ELSIF (v_i = 5) THEN
    -- 15选5的组合
    FOR a IN 1..15 LOOP
      FOR b IN (a + 1) .. 15 LOOP
        FOR c IN (b + 1) .. 15 LOOP
          FOR d IN (c + 1) .. 15 LOOP
            FOR e IN (d + 1) .. 15 LOOP
                 .........................................
            END LOOP;
          END LOOP;
        END LOOP;
      END LOOP;
    END LOOP;
  END IF;
END;



怎么通过一个可变嵌套数的for循环,实现上面的分支嵌套for循环的功能。希望大牛赐教下,谢谢~!



求职 : 数据库开发
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-09 16:42:50
2#
发表于 2018-3-7 11:38 | 只看该作者
递归        

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
21
秀才
日期:2017-08-11 15:38:46秀才
日期:2018-01-02 15:13:25秀才
日期:2018-01-02 15:17:54秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22秀才
日期:2018-01-02 15:18:22技术图书徽章
日期:2018-01-02 15:18:30秀才
日期:2018-01-02 15:05:41
3#
发表于 2018-3-7 12:42 | 只看该作者
n    pls_integer:=0
sign boolean := true
while sign loop
--一定条件下 sign:=False
end loop;

使用道具 举报

回复
论坛徽章:
22
大众
日期:2013-11-20 13:39:432014年世界杯参赛球队: 澳大利亚
日期:2014-05-26 09:13:482014年世界杯参赛球队: 阿尔及利亚
日期:2014-05-28 10:46:58喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47天蝎座
日期:2015-08-07 22:32:03懒羊羊
日期:2015-06-16 10:25:42白羊座
日期:2015-08-05 20:05:55双鱼座
日期:2015-07-30 08:48:43马上有车
日期:2014-05-07 11:14:31
4#
发表于 2018-3-7 14:46 | 只看该作者
回溯算法:

declare
  i       number;
  j       number;
  k       number;
  
  cnt number;

  type arr is record (css   number);
  TYPE type_tab IS TABLE OF arr INDEX BY BINARY_INTEGER;
  t type_tab;
  
  type arrv is record (css   varchar2(30));
  TYPE type_tabb IS TABLE OF arrv INDEX BY BINARY_INTEGER;
  val type_tabb;  -- 存放的15个值
begin

    for i in 0..14 loop
        t(i).css := i+1;
    end loop;
   
    val(0).css := '苹果1';
    val(1).css := '苹果2';
    val(2).css := '苹果3';
    val(3).css := '苹果4';
    val(4).css := '苹果5';
    val(5).css := '苹果6';
    val(6).css := '苹果7';
    val(7).css := '苹果8';
    val(8).css := '苹果9';
    val(9).css := '苹果10';
    val(10).css := '苹果11';
    val(11).css := '苹果12';
    val(12).css := '苹果13';
    val(13).css := '苹果14';
    val(14).css := '苹果15';
   
    i := 3; --组合数3
    j := i;
    cnt := 0;
    while t(0).css <= 15 loop
        if t(i-1).css = 16 then
            t(i-1).css := i;
            i := i - 1;
            t(i-1).css := t(i-1).css + 1;
        else
            if i<j then
               i := i + 1;
            else
                cnt := cnt + 1;
                dbms_output.put_line(t(0).css||','||t(1).css||','||t(2).css||' = '||val(t(0).css-1).css||','||val(t(1).css-1).css||','||val(t(2).css-1).css);
                t(i-1).css := t(i-1).css + 1;
            end if;
        end if;
    end loop;
    dbms_output.put_line('total = '||cnt);
end;

使用道具 举报

回复
论坛徽章:
396
兰博基尼
日期:2013-12-15 15:36:432014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:11
5#
发表于 2018-3-7 15:25 来自手机 | 只看该作者
connect by

使用道具 举报

回复
论坛徽章:
9
马上有车
日期:2014-04-16 17:19:192013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
6#
 楼主| 发表于 2018-3-7 17:59 | 只看该作者
zixinsu 发表于 2018-3-7 14:46
回溯算法:

declare

谢谢,我试试去

使用道具 举报

回复
论坛徽章:
9
马上有车
日期:2014-04-16 17:19:192013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
7#
 楼主| 发表于 2018-3-7 17:59 | 只看该作者

谢谢版主

使用道具 举报

回复
论坛徽章:
9
马上有车
日期:2014-04-16 17:19:192013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
8#
 楼主| 发表于 2018-3-7 18:00 | 只看该作者
谢谢各位!@@@

使用道具 举报

回复
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
9#
发表于 2018-3-7 23:29 | 只看该作者
我再贡献一种动态PLSQL的方法增添趣味:

declare
   v_cnt number :=4;
   v_upper number :=10;
   v_sql varchar2(2000);
begin
   v_sql :='begin';
   for i in 1..v_cnt loop
       v_sql := v_sql||'
            for i'||i||' in '||case when i=1 then '1' else 'i'||(i-1)||'+1' end||'..'||v_upper||' loop';
       if i=v_cnt then
          v_sql := v_sql||'
              dbms_output.put_line(';
              for k in 1..v_cnt loop
                  if k>1 then
                     v_sql := v_sql||'||'',''||';
                  end if;
                  v_sql := v_sql||'i'||k;
              end loop;
              v_sql := v_sql||');';
       end if;
   end loop;

   for i in 1..v_cnt loop
       v_sql := v_sql||'
            end loop;';
   end loop;

   v_sql := v_sql||'
   end;';
   -- dbms_output.put_line(v_sql);
   execute immediate v_sql;
end;
/

使用道具 举报

回复
论坛徽章:
396
兰博基尼
日期:2013-12-15 15:36:432014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:11
10#
发表于 2018-3-8 15:27 | 只看该作者
newkid 发表于 2018-3-7 23:29
我再贡献一种动态PLSQL的方法增添趣味:

declare

nice job

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表