【问题标题】:Increment for loop by a fraction/ range of values in Oracle 19c在 Oracle 19c 中按分数/范围内的值递增 for 循环
【发布时间】:2021-11-03 20:37:27
【问题描述】:

我们如何在存储过程 - oracle 19c 的 for 循环中将值增加 0.25 而不是默认值 1?

另外,是否可以使用数字数组作为循环值?如果没有,请建议如何实施。

例如,

fctr1 - 传递 -4 作为 fct 并且 fctr1 需要增加 .25 直到 4

fctr2 - 5,7,10,14,15,21等非周期值的范围

CREATE OR REPLACE procedure sp_test
   ( fct in number )
is
BEGIN
    for fctr1 in fct..4 ///increment by .25
         loop
            dbms_output.put_line(fctr1);
            for fctr2 in ///range of non periodic values
            loop
                  dbms_output.put_line(fctr2);
            end loop;
        end loop;
END;
/

【问题讨论】:

  • 直到 21c 才添加增量步骤。所以你必须在循环中递增
  • 或者你需要使用一些脑细胞。例如,要以 0.25 为增量从 3 循环到 5,您可以执行类似 for i in 12 .. 20 loop ... 的操作,并在循环中使用 i/4 而不是 i

标签: oracle for-loop oracle19c nested-for-loop


【解决方案1】:

只需在FOR 循环中将限制乘以 4,然后在输出中除以 4:

CREATE OR REPLACE procedure sp_test
   ( fct in number )
is
BEGIN
  for fctr1 in (fct*4) .. (4*4) loop
    dbms_output.put_line(fctr1/4);
    dbms_output.put_line(5);
    dbms_output.put_line(7);
    dbms_output.put_line(10);
    dbms_output.put_line(14);
    dbms_output.put_line(15);
    dbms_output.put_line(21);
  end loop;
END;
/

db小提琴here

【讨论】:

    【解决方案2】:

    如果您使用的是 21c 之前的版本,则无法在 for 中指定增量值。但是您可以用 WHILE 语句替换它,您可以(实际上必须)自己递增;使用您想要的任何所需值。
    至于您退回到架构级别的非周期性值。创建一个集合作为“整数表”,用值填充该集合,作为该集合/数组作为另一个参数传递。比如:

    create or replace procedure sp_test
       ( fct     in number 
       , fct2    in non_periodic_values_t
       , by_incr in number default 1
       )  
    is
       l_fct number := 1;
    begin
      while l_fct <= fct
      loop 
         dbms_output.put_line('For l_fct ==> '   ||  l_fct ); 
         
         for fct2_ndx in 1 .. fct2.count
         loop
            dbms_output.put_line('     ' || fct2(fct2_ndx)); 
         end loop;
         l_fct := l_fct + by_incr; 
         
      end loop;
    end;  
    

    由于您有一个数字集合,您甚至可以传递传统 for 循环的 3 个值(开始、停止、递增)

    create or replace procedure sp_test2
       ( fct     in number 
       , fct2    in non_periodic_values_t
       , for_val non_periodic_values_t  default  non_periodic_values_t(1,4,1) 
       )  
    is
       l_fct number := for_val(1);
       
    begin
      while l_fct <= for_val(2)
      loop 
         dbms_output.put_line('For l_fct ==> '   ||  l_fct ); 
         
         for fct2_ndx in 1 .. fct2.count
         loop
            dbms_output.put_line('     ' || fct2(fct2_ndx)); 
         end loop;
         l_fct := l_fct + for_val(3); 
         
      end loop;
    end; 
    

    examples here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2019-01-17
      • 2020-08-06
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多