2009/10/22

Oracle PL/SQL 中, 不使用 Cursor ,改用 SYS_CONNECT_BY_PATH, 將多筆資料組合成一筆資料

在 Oracle PL/SQL 中,

可以在 Select 使用 SYS_CONNECT_BY_PATH,

就可以將多筆資料組合成一筆資料,

而無需使用 Cursor 的方式組合.

 範例 1

select SYS_CONNECT_BY_PATH( object_name, ',' )
from (select rownum r
, a.object_name
from (select object_name
from user_objects
where object_type = 'TABLE'
and object_name like 'XXF%'
order by object_name
) a -- 先資料排序
) b -- 再取得排序後的 rownum
start with b.r = 1 -- 跟 treeview 一樣, 指定開始位置
connect by prior b.r+1 = b.r; -- 跟 treeview 一樣, 指定父子階層關係

結果 :
,XXFND_FND_USER
,XXFND_FND_USER,XXFND_HIERARCHY
,XXFND_FND_USER,XXFND_HIERARCHY,XXFND_SSO_MAP_USER


 範例 2

select max( ltrim( SYS_CONNECT_BY_PATH( object_name, ',' ), ',' ) )
from (select rownum r
, a.object_name
from (select object_name
from user_objects
where object_type = 'TABLE'
and object_name like 'XXF%'
order by object_name
) a -- 先資料排序
) b -- 再取得排序後的 rownum
start with b.r = 1 -- 跟 treeview 一樣, 指定開始位置
connect by prior b.r+1 = b.r; -- 跟 treeview 一樣, 指定父子階層關係
-- ltrim 是要去除最左邊的多餘的符號
-- max 是要取得最後組合的資料

結果 :
XXFND_FND_USER,XXFND_HIERARCHY,XXFND_SSO_MAP_USER

更進階的應用 : http://www.oracle.com/technology/oramag/code/tips2006/101606.html.

感謝 ECS Julia 小姐的技術指導.