对于每个字符串,执行一个函数/过程

时间:2010-02-11 03:17:50

标签: sql oracle plsql iteration

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

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

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

我认为可能有这种模式。

6 个答案:

答案 0 :(得分:12)

完整性,纯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>

这使用了prelared sys.dbms_debug_vc2coll数据类型,它有相当大的定义......

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

SQL>

......所以,就像加里说的那样,你可能希望宣布自己的。特别是如果你的琴弦很短并且你有很多。

答案 1 :(得分:5)

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;

答案 2 :(得分:3)

我通常使用自己的集合类型,但您可以使用内置的sys.dbms_debug_vc2coll

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

[我错误地将column_name设为column_value。谢谢你的纠正]

答案 3 :(得分:2)

使用:

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

答案 4 :(得分:2)

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

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 :(得分:0)

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;