Oracle SQL 行转列 快速构造行转列记录

忘记哪位朋友教给我的了,但是真的很好用 ,列转行我们可以通过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;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值