Oracle中WMSYS.wm_contact的基本使用与理解

2025-09-29 06:21:34

1、我们首先了解下该函数,第一点那就是存在WMSYS用户(在oracle的XE版本上是不存在该用户的,10g与11g的XE我都已经测试过),我们可以理解为wm_contact是属于WMSYS用户下的。

而不同版本的oracle在对wm_contact的定义的类型不同(这一点表示不知道为什么这么做),如oracle的WMSYS.WM_CONCAT函数在Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi版本中的结果是一个字符型的数据,而在Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi版本中是一个CLOB类型。

字符型还可以接受,但是这个CLOB就是我无法接受的了,因为用了CLOB,你就发现你再也不能distinct和group by了 !

首先创建表:

-- Create tablecreate table TEST(  ID    INTEGER not null,  VALUE CHAR(100),  NAME  VARCHAR2(100),  PHONE VARCHAR2(100))tablespace USERS  pctfree 10  initrans 1  maxtrans 255  storage  (    initial 64K    next 1M    minextents 1    maxextents unlimited  );-- Create/Recreate primary, unique and foreign key constraints alter table TEST  add primary key (ID)  using index   tablespace USERS  pctfree 10  initrans 2  maxtrans 255  storage  (    initial 64K    next 1M    minextents 1    maxextents unlimited  );

向表中插入几条数据,如下:

insert into test (ID, VALUE, NAME, PHONE)values (1, '1', '张三', '15232397122');

insert into test (ID, VALUE, NAME, PHONE)values (2, '2', '李四', '15232374122');

insert into test (ID, VALUE, NAME, PHONE)values (3, '3', '王五', '15232324122');

然后我们执行:

select wmsys.wm_concat(name) name from test

得到结果如下:

Oracle中WMSYS.wm_contact的基本使用与理解

2、可以看到name这一列被拼接在一起了;这里只是一个小例子,只是将这种方式使用出来。

wm_contact这函数一般不怎么会用到,但是根据我自己的最近的理解大概这么几种情况下使用:当主表与从表为一对多的关系的时候,或者元数据中的行列转换的时候。目前我只在这两种情况下使用过,关于元数据的行列转换我不在这里说因为举一个元数据行列的例子太麻烦了,而主表从表这一个比较简单,也适合举例子,如:A表记录老师信息,B表记录学生信息,我去查看老师的信息同时想知道该老师管理那些学生,那么这个时候我们是不是就要将所有的学生的姓名转为一个数据同老师的信息放在一起。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢