Я хотел бы циклично выполниться через список строк и выполнить функцию/процедуру с каждой строкой как аргумент.
Что является лучшей альтернативой следующему общему коду (так как это не законно):
set serveroutput on;
begin
FOR r IN ('The', 'Quick', 'brown', 'fox')
LOOP
dbms_output.put_line( r );
END LOOP;
end;
Я предполагаю, что мог бы быть шаблон для этого.
Для полноты картины, чистое решение на 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>
... поэтому, как говорит Гэри, вы можете объявить свой собственный. Особенно если ваши строки короткие и у вас их много.
Обычно я использую свой собственный тип коллекции, но вы можете использовать встроенный sys.dbms_debug_vc2coll
select column_value from table(sys.dbms_debug_vc2coll('The', 'Quick', 'brown', 'fox'));
{{ 1}}
[У меня неправильно было имя_столбца, а не значение_столбца. Спасибо за исправление]
Использование:
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
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
Ответ здесь зависит от того, откуда берутся строки. На языке, отличном от «языка баз данных», вы, вероятно, каким-то образом поместите строки в массив, а затем перебираете массив, как показано выше. Вопрос в том, жестко ли запрограммирован этот список строк или вы выбираете их из таблицы базы данных?
Решение 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;
/
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;