【问题标题】:For each string, execute a function/procedure对于每个字符串,执行一个函数/过程
【发布时间】:2010-02-11 03:17:49
【问题描述】:

我想遍历一个字符串列表并以每个字符串作为参数执行一个函数/过程。

以下通用代码的最佳替代方案是什么(因为它不合法):

set serveroutput on;  
begin
    FOR r IN ('The', 'Quick', 'brown', 'fox')
    LOOP
        dbms_output.put_line( r );
   END LOOP;
end;

我认为这可能存在模式。

【问题讨论】:

    标签: sql oracle plsql iteration


    【解决方案1】:

    为了完整起见,纯 PL/SQL 解决方案。

    SQL> set serveroutput on
    SQL>
    SQL> declare
      2      my_array sys.dbms_debug_vc2coll
      3          := sys.dbms_debug_vc2coll('The', 'Quick', 'brown', 'fox');
      4  begin
      5     for r in my_array.first..my_array.last
      6      loop
      7          dbms_output.put_line( my_array(r) );
      8     end loop;
      9  end;
     10  /
    The
    Quick
    brown
    fox
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    这使用了预先声明的sys.dbms_debug_vc2coll 数据类型,它有一个相当宽泛的定义......

    SQL> desc sys.dbms_debug_vc2coll
     sys.dbms_debug_vc2coll TABLE OF VARCHAR2(1000)
    
    SQL>
    

    ...所以,就像 Gary 所说,您不妨声明自己的。特别是如果您的字符串很短并且您有很多字符串。

    【讨论】:

    • 这样更好。对不起小马:)
    【解决方案2】:
    DECLARE
      -- 1. declare a list type
      TYPE STR_LIST_TYPE IS TABLE OF VARCHAR2(15);
    
      -- 2. declare the variable of the list
      V_STR_VALUES STR_LIST_TYPE;
    
      -- 3. optional variable to store single values
      V_STR_VALUE VARCHAR2(15);
    
    BEGIN
    
      -- 4. initialize the list of values to be iterated in a for-loop
      V_STR_VALUES := STR_LIST_TYPE('String 1','String 2');
    
      -- 5. iterating over the values
      FOR INDX IN V_STR_VALUES.FIRST..V_STR_VALUES.LAST
      LOOP
    
        -- 6. accessing the value itself
        V_STR_VALUE := V_STR_VALUES(INDX);
    
      END LOOP;     
    END;
    

    【讨论】:

      【解决方案3】:

      我一般使用自己的集合类型,但是你可以使用内置的sys.dbms_debug_vc2coll

      select column_value from table(sys.dbms_debug_vc2coll('The', 'Quick', 'brown', 'fox'));
      

      [我错误地使用了 column_name 而不是 column_value。感谢指正]

      【讨论】:

        【解决方案4】:

        这里的答案取决于字符串的来源。在非“数据库语言”中,您可能会以某种方式将字符串放入数组中,然后循环遍历数组,如上所示。问题是,字符串列表是硬编码的,还是从数据库表中选择的?

        OMG Ponies 解决方案会起作用,但它可能涉及不必要的选择。您可能会更好地使用 PLSQL 表或可变数组 - 正如我所说,这取决于您如何将字符串放入您需要处理的程序中。下面是一个使用 plsql 表的例子:

        declare
          type myarray is table of varchar2(255) index by binary_integer;
          v_array myarray;
        begin
          v_array(v_array.count + 1) := 'The';  
          v_array(v_array.count + 1) := 'quick';
          v_array(v_array.count + 1) := 'brown';
          v_array(v_array.count + 1) := 'fox';
          for i in 1..v_array.count loop
            dbms_output.put_line(v_array(i));
          end loop; 
        end;
        /
        

        【讨论】:

          【解决方案5】:

          用途:

          SELECT package.your_function(x.col)
            FROM (SELECT 'The' AS col
                    FROM DUAL
                  UNION ALL
                  SELECT 'Quick'
                    FROM DUAL
                  UNION ALL
                  SELECT 'brown'
                    FROM DUAL
                  UNION ALL
                  SELECT 'fox'
                    FROM DUAL) x
          

          Oracle 9i+,使用子查询分解 (AKA CTE)


          WITH list AS (
            SELECT 'The' AS col
              FROM DUAL
            UNION ALL
            SELECT 'Quick'
              FROM DUAL
            UNION ALL
            SELECT 'brown'
              FROM DUAL
            UNION ALL
            SELECT 'fox'
             FROM DUAL)
          SELECT package.your_function(x.col)
            FROM list x
          

          【讨论】:

            【解决方案6】:
            set serveroutput on;  
            begin
               dbms_output.put_line('The');
               dbms_output.put_line('Quick');
               dbms_output.put_line('brown');
               dbms_output.put_line('fox');
            end;
            

            【讨论】:

            • 我现在有这个。试图避免这种情况:D
            • 只是指出,如果您有 smallstatic 值并且您只想重复一个 single 他们每个人的代码行,最简单的解决方案通常是最好的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-05
            • 1970-01-01
            • 1970-01-01
            • 2019-09-02
            • 2012-03-15
            • 1970-01-01
            相关资源
            最近更新 更多