对于每个字符串,执行一个函数/过程
Posted
技术标签:
【中文标题】对于每个字符串,执行一个函数/过程【英文标题】: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;
我认为这可能存在模式。
【问题讨论】:
【参考方案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 只是指出,如果您有 small 个 static 值并且您只想重复一个 single 他们每个人的代码行,最简单的解决方案通常是最好的。以上是关于对于每个字符串,执行一个函数/过程的主要内容,如果未能解决你的问题,请参考以下文章