Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2839135
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2013-01-05 14:50:18

有时候我们很可能遇到逗号分隔的字符串转为嵌套表的情况,
如果采用传统的方法,需要写个循环,比较麻烦,如下所示:


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值。
等等。
阅读(1920) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~