ETL实用函数和存储过程(一)

致力做一个首先想的是怎么帮助别人的人
点赞再看,谢谢支持

前言

想要提高编程效率,就必须学会造轮子,造好的轮子随时使用,随时开车。

今天分享一些实用的函数和存储过程(轮子),希望你能够用上。

一、(‘0a,0b,0c’)–>(‘0a’,‘0b’,‘0c’)

  • 传入参数:逗号分隔的字符串

  • 输出结果:逗号分隔的带单引号的字符串

  • 使用场景:当老师想要在文本框中输入多个学生名称(逗号分隔)查询学生信息时
    老师输入:张三,王五,李四

  • 系统接收:‘张三,王五,李四’
    如果直接使用接收到的字符串进行查询,结果为空
    select * from students where student_name in (‘张三,王五,李四’);

  • 系统先要对接收到的字符串进行处理,
    处理之后:‘张三’,‘王五’,‘李四’
    select * from students where student_name in (‘张三’,‘王五’,‘李四’);

  • 函数代码如下:

create or replace function f_change_str_to_str(a_str in varchar2)
  return varchar2 is
  /*
  --模块功能:字符串转换_例('0a,0b,0c')-->('0a','0b','0c')
  --a_str: 传入字符串
  --demo: select f_change_str_to_str('0a,0b,0c') from dual;
  */
  
  oldstr     varchar2(4000) := a_str;
  newstr     varchar2(4000) := null; --返回加单引号之后的值
  v_commapos number(4); --逗号位置
  v_curitem  varchar2(4000) := ''; --当前添加项(不包含单引号)
  
begin
  loop
    exit when oldstr is null;
    v_commapos := instr(oldstr, ','); --v_startpos
    if (v_commapos = 0) then
      --没有找到
      v_curitem := oldstr;
      oldstr    := null; --停止查找
    else
      v_curitem := substr(oldstr, 1, v_commapos - 1);
      --修改oldstr
      oldstr := substr(oldstr,
                       v_commapos + 1,
                       length(oldstr) - length(v_curitem) - 1);
    end if;
    
    if (newstr is null) then
      newstr := '''' || v_curitem || '''';
    else
      newstr := newstr || ',''' || v_curitem || '''';
    end if;
  end loop;
  
  return newstr;
  
end;

二、字符串转数组

  • 传入参数:字符串,分隔符

  • 输出结果:数组

  • 使用场景:在使用in条件查询的时候,集合个数是有限制的,并且集合个数多了之后查询性能很慢,此时可以改为join方式,当选择全年级的学生时(1000+)

  • 系统接收:‘张三,王五,…,李四’
    这个时候用in处理的话,集合个数过多会报错,即使还没有达到集合上线,查询速度也很慢。

  • 系统对字符串转换处理成为数组,然后用join的方式查询
    select *
    from students t1
    join table(f_str_to_array(‘张三,王五,…,李四’,’,’)) t2
    on t1.student_name=t2.column_value

  • 函数代码如下

CREATE OR REPLACE FUNCTION f_str_to_array (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
  RETURN array_num
IS
  j INT := 0;
  i INT := 1;
  len INT := 0;
  len1 INT := 0;
  str VARCHAR2 (4000);
  str_split array_num := array_num();
BEGIN
  len := LENGTH (p_str);
  len1 := LENGTH (p_delimiter);

  WHILE j < len
  LOOP
    j := INSTR (p_str, p_delimiter, i);

    IF j = 0
    THEN
        j := len;
        str := SUBSTR (p_str, i);
        str_split.EXTEND;
        str_split (str_split.COUNT) := str;

        IF i >= len
        THEN
          EXIT;
        END IF;
    ELSE
        str := SUBSTR (p_str, i, j - i);
        i := j + len1;
        str_split.EXTEND;
        str_split (str_split.COUNT) := str;
    END IF;
  END LOOP;

  RETURN str_split;
END;

今天分享的对你有帮助吗,如果有,请点个赞,鼓励鼓励我吧,谢谢。

发布了8 篇原创文章 · 获赞 8 · 访问量 390
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览