对字符串中的字母或数据去重

--自定义类型,管道函数可以返回多行数据,所以不能使用基础数据类型
create or replace type typ_split as table of varchar2 (4000);

--创建管道函数
create or replace function cvg_split(p_string varchar2,
                                     p_flag   varchar2 default ',')
    return typ_split --返回自定义类型
    pipelined is     --管道函数关键字
    idx      pls_integer;
    v_string varchar2(4000) := p_string;
begin
    loop
        idx := instr(v_string, p_flag);
        if idx > 0 then
            pipe row(substr(v_string, 1, idx - 1)); --管道函数返回一行使用
            v_string := substr(v_string, idx + length(p_flag));
        else
            pipe row(v_string); --管道函数返回一行使用
            exit;
        end if;
    end loop;
end;

--使用管道函数
select * from table(cvg_split('A,A,BN,I,I,99'));

--使用管道函数,去重合并为一行
select to_char(wm_concat(distinct column_value)) from table(cvg_split('A,A,BN,I,I,99'));

--------------------------------------------------------------------------------------

--合并为一行
select to_char(xmlagg(xmlparse(content t.fld_nm || ',' wellformed) order by t.fld_nm).getclobval())
      ,to_char(rtrim(xmlagg(xmlelement(e,t.fld_nm,',').extract('//text()')).getclobval(),','))
      ,listagg(t.fld_nm,',')within group(order by t.fld_nm) as pol_list --超过4000报错
  from tfield_values t
 group by t.fld_nm;

--------------------------------------------------------------------------------------

--并行处理大量数据,开多个JOB跑数
declare
    parameters_id varchar2(100):='213131,435345';
    cursor_wsfmdj sys_refcursor;
    sqlstr        varchar2(8000);
begin
    sqlstr := ' select a.* from test_risks a where a.newid in( ';
    for parameters_rec in (select to_char(column_value) code
                             from table(orcl_split_str(parameters_id, ','))) loop
        sqlstr := sqlstr || '''' || parameters_rec.code || '''' || ',';
    end loop;
    sqlstr := substr(sqlstr, 0, (length(sqlstr) - 1)) || ')';
    --open cursor_wsfmdj for sqlstr; --打开游标
    
    dbms_output.put_line(sqlstr);
    
    
end get_cursor_wsfmdj;
/

create or replace procedure proc_test(p_plancd varchar2) is
begin
    update test_risks a set a.vers_num = '00' where a.plan_code = 'ETB17';
    dbms_lock.sleep(3);
    insert into taml_wrk_logs values (sys_guid(), '999', sysdate);

end proc_test;
/
declare
    str_job varchar2(4000);
begin
    delete taml_wrk_logs;
    --产生5个线程调用处理数据
    for x in 1 .. 5 loop
        str_job := '
          declare
              prm_appcode number(3);
              prm_errmesg varchar2(200);
          begin
              proc_test(''' || x || ''');
          end;
        ';
    
        dbms_scheduler.create_job(job_name   => 'TEST_YZ' || x
                                 ,job_type   => 'plsql_block'
                                 ,job_action => str_job
                                 ,start_date => sysdate
                                 ,enabled    => false
                                 ,auto_drop  => true
                                 ,comments   => 'test_yz_数据同步' || x);
        dbms_scheduler.enable(name => 'TEST_YZ' || x);
        --dbms_scheduler.run_job('TEST_YZ'||x);
        dbms_output.put_line('X:' || x);
    end loop;
end;
/

select * from user_scheduler_jobs  a where upper(a.job_name) like '%TEST_YZ%' ;
select * from user_scheduler_running_jobs a where upper(a.job_name) like '%TEST_YZ%' ;


--------------------------------------------------------------------------------------

--产生序号
select rownum from dual connect by rownum<=10;

--------------------------------------------------------------------------------------

create table tb_company
(
  company_id integer primary key,
  company varchar2(256),
  up_companyid integer
);
 
insert into tb_company values (0, '总公司', null);
insert into tb_company values (1, '北京分公司', 0);
insert into tb_company values (2, '上海分公司', 0);
insert into tb_company values (3, '海淀区分部', 1);
insert into tb_company values (4, '东城区分部', 1);
insert into tb_company values (5, '黄埔区分部', 2);
insert into tb_company values (6, '静安区分部', 2);
commit;

select * from tb_company;
--递归查询SQL:
select rpad(' ', 2 * (level - 1), '-') || company company_name,
       company,
       connect_by_root company,           --返回当前节点的最顶端节点 
       connect_by_isleaf,                 --判断是否为叶子节点,如果这个节点下面有子节点,则不为叶子节点  
       level,                             --伪列 表示节点深度 
       sys_connect_by_path(company, '/'), --函数显示详细路径,并用"/"分隔
       regexp_replace(sys_connect_by_path(company, '/'), '/', '', 1, 1) --函数显示详细路径,并用"/"分隔, 去掉第1个"/"
  from tb_company
 start with up_companyid is null
connect by prior company_id = up_companyid;

--递归查询SQL:
select *
  from tb_company
 start with company_id = 1
connect by prior company_id = up_companyid;


--------------------------------------------------------------------------------------

instr('源字符串','目标字符串',开始位置,第几次出现) --对某个字符串进行判断,判断其是否含有指定的字符
substr('目标字符串',开始位置,长度)                 --取得字符串中指定起始位置和长度的字符串
regexp_replace('源字符串','目标字符串','替换目标字符串',开始位置,第几次出现) --

--------------------------------------------------------------------------------------

ntile(10) over(order by 排序字段)  --平均拆分成10份
--例:
select nt,count(1)
  from (select ntile(10) over(order by id) nt,id from tcomm_status)
 group by nt;

--------------------------------------------------------------------------------------
--导出CSV简化模板
set echo off        --不展示脚本命令
set feedback off    --屏蔽展示行数
set heading off     --标题(linesize设置的值才有效果)
set linesize 30000  --每行允许的最大字符数
set pagesize 0      --不准分页
set term off        --不在屏幕上输出执行结果
set termout off     --屏蔽脚本中的命令的执行结果

spool D:\Test.csv

select '客户号,身份证号,名称' from dual
 union all
select cli_num || chr(9) || ',' || id_num || chr(9) || ',' || cli_nm 
  from tclient_details
 where rownum <= 10;

spool off
exit

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值