最近接到一个需求,需要将dba_users下面的用户剔除掉一部分,然后合并并通过逗号分隔开!如果:user1,user2,user3......
这个需求本来可以通过oracle 的WMSYS.WM_CONCAT这个函数来实现,但是这个函数在9I中不存在,需要通过执行如下脚本创建。
@$ORACLE_HOME/rdbms/admin/owmctab.plb
@$ORACLE_HOME/rdbms/admin/owmaggrs.plb
@$ORACLE_HOME/rdbms/admin/owmaggrb.plb
但是这个WMSYS.WM_CONCAT函数不推荐使用,所以还是要靠sql代码来实现。
下面将我的代码贴出来,还请高手指点
select username
from (select ltrim(sys_connect_by_path(username, ','), ',') username
from (select t.username username,
row_number() over(order by t.username) rank
from (select USERNAME
from dba_users
where default_tablespace not in ('DBADATA', 'SYSAUX')
AND username not like 'COW%'
AND username not like 'DEV%'
AND username not like 'ORACLE%'
and username not like '%$%'
AND username not like 'I3_ORCL%'
AND USERNAME NOT IN
('SYS', 'SYSTEM', 'OVSEE', 'PERFSTAT', 'OUTLN',
'WKSYS', 'SCOTT', 'WMSYS', 'CTXSYS', 'XDB',
'MDSYS', 'ORDSYS', 'ORDPLUGINS', 'ANONYMOUS',
'DMLBAK', 'DEPLOYOP', 'TOADEXP', 'TOAD',
'SQLTXPLAIN', 'SPOTLIGHT', 'GGMGR', 'FGLPA',
'FOGLIGHT', 'DGEXP', 'FACTUSERMGR', 'PUB_TEST',
'PUB_QUERY', 'SUPER_TEST', 'TOM', 'DIP',
'EDSOP', 'EXFSYS', 'LBACSYS', 'SOLIX')
MINUS
SELECT OA_NAME FROM DBMGR.FACTUSER_LIST) t)
connect by rank - 1 = prior rank --最关键的就在这里通过递归调用不断的增加长度
order by length(username) desc)
where rownum = 1