【问题标题】:how to write loop in pl/sql that goes over numbers如何在 pl/sql 中编写遍历数字的循环
【发布时间】:2010-07-09 16:55:51
【问题描述】:

我想写一个循环遍历数字105 102 19 17 101 16 106 107

对于每次迭代,我想将数字插入查询并将其插入表中。

伪:

LOOP (105 102 19 17 101 16 106 107)
   FETCH select * from some_table where value=current_iteration_index --105..etc.
   INTO my_rec_type

END LOOP;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    另一种方法:

    declare
     type numListType is table of number;
     numList numListType;
    begin
    numList := numListType(
     105,102,19,17,101,16,106,107 
    );
    for i in numList.FIRST..numList.LAST loop
     -- your usage of element goes here
     dbms_output.put_line(numList(i));
    end loop;
    end;
    /
    

    【讨论】:

      【解决方案2】:

      这里有一个更简洁但同样丑陋的替代方案:

      DECLARE 
      CURSOR C IS
      SELECT val 
        FROM (SELECT LEVEL val FROM dual CONNECT BY LEVEL < 1000)
       WHERE val IN (105,102,19,17,101,16,106,107);
      BEGIN
        FOR R IN C LOOP
          select * 
           INTO my_rec_type
           from some_table
          where value=R.val; --105..etc.
          ... more stuff
        END LOOP;
      END;
      

      这里的优势 (IMO) 是您只需要修改 IN 列表,也许还需要修改 CONNECT BY 子句的限制来更改您的结果。

      【讨论】:

      • 是否可以将最终my_rec_type 的结果放入游标中?或者将结果插入到循环中的游标中?
      • 不完全确定您想要做什么。您可以在 my_rec_type 记录中分配各种字段,然后使用该记录来更新最初获取的记录: my_rec_type.fieldname := 'some new value'; UPDATE some_table SET ROW = my_rec_type WHERE value = R.val;
      • 如果这些数字也从表格中获取,该怎么办?
      【解决方案3】:

      虽然有几个解决方案可以解决您的问题,但根据您的处理方式,我将告诉您,我认为您的处理方式错误 - 您没有利用数据库的功能.

      你能解释一下为什么

      select * from some_table where value in (105, 102, 19, 17, 101, 16, 106, 107)
      

      没有做你想让它做的事?

      【讨论】:

      • 我认为最初发布的伪代码只是对更复杂的程序的简化,但当然,如果这就是所需要的,那么这是最有效的 - 考虑用户名时 +1。跨度>
      • 因为列表中不包含逗号? ;-)
      • 有趣的政策。我工作的地方会发生很大的变化。我假设您已经测试过一次选择 1 个值在 8 秒限制内有效。
      • 因此,他们支付开发人员的劳动时间来划分查询以在 8 秒内运行。哇...
      • @learn_plsql:获取 Tom Kyte 的“专家 Oracle 数据库体系结构”的副本,阅读它,您将拥有击落糟糕政策所需的所有弹药。请注意关于锁定的章节。 Oracle 不是 SQL Server,反之亦然。如果管理层仍然不听,那就找一份你没有被白痴包围的工作。
      【解决方案4】:

      这是一个选项,使用 Cursor FOR LOOP%ROWTYPE attribute

      DECLARE
      
        my_rec_type SOME_TABLE%ROWTYPE;
      
        CURSOR c IS 
          SELECT 105 AS c_index FROM DUAL
          UNION ALL
          SELECT 102 AS c_index FROM DUAL 
          UNION ALL
          SELECT 19 AS c_index FROM DUAL 
          UNION ALL
          SELECT 17 AS c_index FROM DUAL 
          UNION ALL
          SELECT 101 AS c_index FROM DUAL
          UNION ALL
          SELECT 16 AS c_index FROM DUAL 
          UNION ALL
          SELECT 106 AS c_index FROM DUAL
          UNION ALL
          SELECT 107 AS c_index FROM DUAL
      
      BEGIN
      
        FOR cursor_rec IN c
        LOOP
      
           SELECT * 
             INTO my_rec_type
             FROM some_table 
             WHERE value = cursor_rec.c_index;
      
        END LOOP;
      
      END;
      

      【讨论】:

      • 我的主要演唱会将它分解成不同的查询。我不想使用 union all 在一个查询中完成所有操作
      • @learn_plsql:然后查看 DCookie 的答案;我不清楚您将如何获取/提供查询中指定的数字。使用 UNION ALL 没有错...
      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 2014-09-27
      • 2016-07-24
      • 2017-06-01
      • 2012-04-07
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多