忘记哪位朋友教给我的了,但是真的很好用 ,列转行我们可以通过list_agg()函数进行转换,但通过行专列,就稍微复杂一些,这里提供一种简短的字符行专列的方案,可以通过如下脚本进行转换:
SELECT regexp_substr('1,2,3,4,5,6,7,8,9',
'[^,]+', --CHR(91) || CHR(94) || ',' || CHR(93) || CHR(43)
1,
LEVEL) sidd
FROM dual
CONNECT BY regexp_substr('1,2,3,4,5,6,7,8,9', '[^,]+', 1, LEVEL) IS NOT NULL;
执行效果:
向前辈致敬,解决了我很多处理问题。
比如我们有时候要测试一些数据处理的结果,为了快捷,我们就可以直接通过该方法快速形成一个循环来达到测试一组无规则的数据
举个我经常使用的脚本(EBS使用的脚本,仅举例使用),给一部分用户分配职责,因为懒所以就搞了个简单的脚本,每次简单修改一下,就直接一次性分配完成,省的到界面一个一个用户查找进行分配,大家可以参考取用
--给a1,a2,a3,a4 分配1013开头职责
DECLARE
lc_user_name VARCHAR2(100) := 'DEV';
lc_resp_appl_short_name VARCHAR2(100) := 'SQLGL';
--lc_responsibility_key VARCHAR2(100) := 'APPLICATION_DEVELOPER';
lc_security_group_key VARCHAR2(100) := 'STANDARD';
ld_resp_start_date DATE := SYSDATE;
ld_resp_end_date DATE := NULL;
l_users VARCHAR2(2400) := 'a1,a2,a3,a4';
CURSOR cuser IS
SELECT regexp_substr(l_users,
'[^,]+', --CHR(91) || CHR(94) || ',' || CHR(93) || CHR(43)
1,
LEVEL) sidd
FROM dual
CONNECT BY regexp_substr(l_users, --
'[^,]+',
1,
LEVEL) IS NOT NULL;
BEGIN
FOR i IN cuser LOOP
FOR resp IN (SELECT f.responsibility_key
FROM fnd_responsibility f
WHERE 1 = 1
AND substr(f.responsibility_key, 1, 4) IN
(/*'1011', '1012',*/'1013')
/*AND f.responsibility_key NOT LIKE '%SUPER%'*/
) LOOP
dbms_output.put_line(resp.responsibility_key);
fnd_user_pkg.addresp(username => i.sidd,
resp_app => lc_resp_appl_short_name,
resp_key => resp.responsibility_key,
security_group => lc_security_group_key,
description => NULL,
start_date => ld_resp_start_date,
end_date => ld_resp_end_date);
END LOOP;
END LOOP;
--COMMIT;
EXCEPTION
WHEN OTHERS THEN
--ROLLBACK;
dbms_output.put_line(SQLERRM);
END;