Для каждой строки выполните функцию/процедуру

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

Что является лучшей альтернативой следующему общему коду (так как это не законно):

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

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

10
задан APC 12 February 2010 в 21:56
поделиться

5 ответов

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

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

14
ответ дан 3 December 2019 в 15:51
поделиться

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

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

[У меня неправильно было имя_столбца, а не значение_столбца. Спасибо за исправление]

4
ответ дан 3 December 2019 в 15:51
поделиться

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

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
2
ответ дан 3 December 2019 в 15:51
поделиться

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

Решение OMG Ponies будет работать, но оно предполагает, возможно, ненужный выбор. Возможно, вам лучше использовать таблицу PLSQL или varrays - как я уже сказал, это зависит от того, как вы вводите строки в свою программу, которые вам нужно обработать. Вот пример использования таблиц 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
ответ дан 3 December 2019 в 15:51
поделиться
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;
0
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: