行列转换 listagg & wm_concat的安装

来源:互联网 发布:cad编程 编辑:程序博客网 时间:2024/05/17 01:23

在将Oracle8i升级到Oracle10g后,应用程序的部分视图编译不能通过。提示错误如下:

ORA-00904: "wm_concat":invalid identifier

查询DBA_OBJECTS视图,也未发现wm_concat的相关信息。

简单来说,用SQLPLUS执行下一下几个脚本就可以了。

 

  1. SQL>@$ORACLE_HOME\RDBMS\ADMIN\owmctab.plb;  
  2. SQL>@$ORACLE_HOME\RDBMS\ADMIN\owmaggrs.plb  
  3. SQL>@$ORACLE_HOME\RDBMS\ADMIN\owmaggrb.plb  

今天才发现了wmsys.wm_concat这个有趣有用的函数,它的作用是以','链接字符。

例子如下:

SQL> create table idtable (id number,name varchar2(30));

Table created

SQL> insert into idtable values(10,'ab');

1 row inserted

SQL> insert into idtable values(10,'bc');

1 row inserted

SQL> insert into idtable values(10,'cd');

1 row inserted

SQL> insert into idtable values(20,'hi');

1 row inserted

SQL> insert into idtable values(20,'ij');

1 row inserted
SQL> insert into idtable values(20,'mn');

1 row inserted

SQL> select * from idtable;

        ID NAME
---------- ------------------------------
        10 ab
        10 bc
        10 cd
        20 hi
        20 ij
        20 mn

6 rows selected
SQL> select id,wmsys.wm_concat(name) name from idtable
  2  group by id;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab,bc,cd
        20 hi,ij,mn

SQL> select id,wmsys.wm_concat(name) over (order by id) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab,bc,cd
        10 ab,bc,cd
        10 ab,bc,cd
        20 ab,bc,cd,hi,ij,mn
        20 ab,bc,cd,hi,ij,mn
        20 ab,bc,cd,hi,ij,mn

6 rows selected

SQL> select id,wmsys.wm_concat(name) over (order by id,name) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab
        10 ab,bc
        10 ab,bc,cd
        20 ab,bc,cd,hi
        20 ab,bc,cd,hi,ij
        20 ab,bc,cd,hi,ij,mn

6 rows selected

个人觉得这个用法比较有趣.

SQL> select id,wmsys.wm_concat(name) over (partition by id) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab,bc,cd
        10 ab,bc,cd
        10 ab,bc,cd
        20 hi,ij,mn
        20 hi,ij,mn
        20 hi,ij,mn

6 rows selected

SQL> select id,wmsys.wm_concat(name) over (partition by id,name) name from idtable;

        ID NAME
---------- --------------------------------------------------------------------------------
        10 ab
        10 bc
        10 cd
        20 hi
        20 ij
        20 mn

6 rows selected

 

 

 

select flag,
       listagg(x, ',') within group(order by x) rx,
       listagg(y, ',') within group(order by y) ry,
       listagg(z, ',') within group(order by z desc) rz
  from ttt
group by flag
order by flag;

 

 

 

 

原创粉丝点击