有时候我们很可能遇到逗号分隔的字符串转为嵌套表的情况,
如果采用传统的方法,需要写个循环,比较麻烦,如下所示:
SQL> declare
2 TYPE STRING_TABLE IS TABLE OF VARCHAR2(227) INDEX BY BINARY_INTEGER;
3 v_strlist STRING_TABLE;
4 v_string VARCHAR2(200);
5 v_pos int;
6 v_str varchar2(20);
7 v_idx int:=1;
8 begin
9 v_string := 'a,b,c,d,e,f,g';
10 v_pos := INSTR(v_string,',');
11 while v_pos > 0 loop
12 v_str := substr(v_string,1,v_pos);
13 v_string := substr(v_string,v_pos+1);
14 v_str := replace(v_str,',');
15 v_strlist(v_idx):=v_str;
16 V_POS := instr(v_string,',');
17 v_idx:=v_idx+1;
18 end loop;
19 v_strlist(v_idx):=v_string;
20 for i in v_strlist.first..v_strlist.last
21 loop
22 dbms_output.put_line(v_strlist(i));
23 end loop;
24 end;
25 /
a
b
c
d
e
f
g
PL/SQL 过程已成功完成。
最近才发现ORACLE提供了类似的过程来实现这个功能。
如下所示:
SQL> declare
2 v_strlist dbms_utility.uncl_array;
3 v_string VARCHAR2(200);
4 v_tablen binary_integer:=0;
5 begin
6 v_string := 'a,b,c,d,e,f,g';
7 dbms_utility.comma_to_table(v_string,v_tablen,v_strlist);
8 for i in 1..v_tablen
9 loop
10 dbms_output.put_line(v_strlist(i));
11 end loop;
12 end;
13 /
a
b
c
d
e
f
g
PL/SQL 过程已成功完成。
有了这个过程大大简化了我们的代码逻辑。
同时ORACLE还提供了一个过程用于将表类型组合为一个字符串:
如下:
SQL> declare
2 v_strlist dbms_utility.uncl_array;
3 v_string VARCHAR2(200);
4 v_tablen binary_integer:=0;
5 begin
6 v_strlist(1):='a';
7 v_strlist(2):='b';
8 v_strlist(3):='c';
9 v_strlist(4):='d';
10 v_strlist(5):='e';
11 v_strlist(6):='f';
12 v_strlist(7):='g';
13 dbms_utility.table_to_comma(v_strlist,v_tablen,v_string);
14 dbms_output.put_line(v_string);
15 end;
16 /
a,b,c,d,e,f,g
PL/SQL 过程已成功完成。
DBMS_UTILITY 包里面有很多有用的过程,譬如:
DBMS_UTILITY.COMPILE_SCHEMA 用于编译某个模式中失效的对象。
DBMS_UTILITY.IS_CLUSTER_DATABASE用户判断是否是集群数据库。
DBMS_UTILITY。SQLID_TO_SQLHASH SQLID转为SQL HASH值。
等等。
阅读(1955) | 评论(0) | 转发(0) |