Для каждой строки выполните функцию / процедуру - PullRequest
9 голосов
/ 11 февраля 2010

Я бы хотел просмотреть список строк и выполнить функцию / процедуру с каждой строкой в ​​качестве аргумента.

Какая лучшая альтернатива следующему универсальному коду (поскольку он не является законным):

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

Я предполагаю, что для этого может быть шаблон.

Ответы [ 6 ]

12 голосов
/ 11 февраля 2010

Просто для полноты, чистое решение 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>

... так что, как говорит Гэри, вы можете заявить о себе. Особенно, если ваши строки короткие и у вас их много.

5 голосов
/ 06 ноября 2015
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 голосов
/ 11 февраля 2010

Я обычно использую свой собственный тип коллекции, но вы можете использовать встроенный sys.dbms_debug_vc2coll

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

[У меня неправильно было column_name, а не column_value. Спасибо за исправление]

2 голосов
/ 11 февраля 2010

Ответ здесь зависит от того, откуда берутся строки. В не «языке базы данных» вы, вероятно, каким-то образом поместите строки в массив, а затем зациклите массив, как вы уже показали выше. Вопрос в том, является ли этот список строк жестко запрограммированным, или вы выбираете их из таблицы базы данных?

Решение 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;
/
2 голосов
/ 11 февраля 2010

Использование:

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
0 голосов
/ 11 февраля 2010
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;
...