Oracle中的substr()函数详解及应⽤
1、substr函数格式  (俗称:字符截取函数)
  格式1: substr(string string, int a, int b);
  格式2:substr(string string, int a) ;
解析:
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第⼀位开始截取)
3、b 要截取的字符串的长度
格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后⾯所有的字符串。
2、实例解析
格式1:
1、select substr('HelloWorld',0,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
2、select substr('HelloWorld',1,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
3、select substr('HelloWorld',2,3) value from dual; //返回结果:ell,截取从“e”开始3个字符
4、select substr('HelloWorld',0,100) value from dual; //返回结果:HelloWorld,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最⼤数量返回。
5、select substr('HelloWorld',5,3) value from dual; //返回结果:oWo
6、select substr('Hello World',5,3) value from dual; //返回结果:o W (中间的空格也算⼀个字符串,结果是:o空格W)
7、select substr('HelloWorld',-1,3) value from dual; //返回结果:d (从后⾯倒数第⼀位开始往后取1
个字符,⽽不是3个。原因:下⾯红⾊第三个注解)
8、select substr('HelloWorld',-2,3) value from dual; //返回结果:ld (从后⾯倒数第⼆位开始往后取2个字符,⽽不是3个。原因:下⾯红⾊第三个注解)
9、select substr('HelloWorld',-3,3) value from dual; //返回结果:rld (从后⾯倒数第三位开始往后取3个字符)
10、select substr('HelloWorld',-4,3) value from dual; //返回结果:orl (从后⾯倒数第四位开始往后取3个字符)
(注:当a等于0或1时,都是从第⼀位开始截取(如:1和2))
(注:假如HelloWorld之间有空格,那么空格也将算在⾥⾯(如:5和6))
(注:虽然7、8、9、10截取的都是3个字符,结果却不是3 个字符;只要 |a| ≤ b,取a的个数(如:7、8、9);当 |a| ≥ b时,才取b的个数,由a决定截取位置(如:9和10))
格式2:
11、select substr('HelloWorld',0) value from dual;  //返回结果:HelloWorld,截取所有字符
12、select substr('HelloWorld',1) value from dual;  //返回结果:HelloWorld,截取所有字符
13、select substr('HelloWorld',2) value from dual;  //返回结果:elloWorld,截取从“e”开始之后所有字符
14、select substr('HelloWorld',3) value from dual;  //返回结果:lloWorld,截取从“l”开始之后所有字符
15、select substr('HelloWorld',-1) value from dual;  //返回结果:d,从最后⼀个“d”开始往回截取1个字符
16、select substr('HelloWorld',-2) value from dual;  //返回结果:ld,从最后⼀个“d”开始往回截取2个字符
17、select substr('HelloWorld',-3) value from dual;  //返回结果:rld,从最后⼀个“d”开始往回截取3个字符
(注:当只有两个参数时;不管是负⼏,都是从最后⼀个开始往回截取(如:15、16、17))
3、实例截图:
例1、
例2、
例5、
例6、
例7、
例8、
例9、
例10、
例15、
例16、
例17、
4)完整函数实例
1create or replace function get_request_code return varchar2AS
2
3-- 函数的作⽤:⾃动⽣成单号
4  v_mca_no  a_no%TYPE; -- 新建⼀个形参v_mca_no,是以mcode_apply表中的mca_no字段的类型相同
5
6CURSOR get_max_mca_no IS--get_max_mca_no 游标
7SELECT max(substr(mca_no, 11, 3)) -- 查出的最⼤单号,截取出最后三位,如:001、00n
8FROM  mcode_apply
9WHERE  substr(mca_no, 3, 8) = to_char(sysdate, 'YYYYMMDD'); -- 截取单号【如:20170422】,to_char():把时间转换为字符型,即string类型。
oracle 时间转换10
11  v_requestcode VARCHAR2(3); -- 形参(参数)
12
13BEGIN
14OPEN get_max_mca_no;
15FETCH get_max_mca_no INTO v_requestcode; -- 把游标中查到的值,赋值给 v_requestcode 形参
16CLOSE get_max_mca_no;
17
18IF v_requestcode IS NULL THEN
19    v_requestcode := NVL(v_requestcode, 0);  -- NVL()函数:当v_requestcode为NULL时,取0作为值
20END IF;
21
22    v_requestcode:= lpad(v_requestcode+1,3,'0'); -- 将游标中截取到的值加1,然后向左填充0,⽣成 00n 三位数的序号; lpad()函数:向左填充
23    v_mca_no:='MA'||to_char(sysdate,'YYYYMMDD')||v_requestcode; -- 最终⽣成的申请单号(如:MA20170422001;MA20170422002;...MA2017042200N )
24
25RETURN'0~,'||v_mca_no;
26
27END ;
注:如要测试该函数,请复制到oracle数据库中,右击函数名 “get_request_code” 选择test测试,测试时记得把相应的表名及字段换成⾃⼰建⽴的
原创作者:
版权声明:欢迎转载,转载务必说明出处。(如果本⽂对您有帮助,可以点击⼀下右下⾓的推荐,或评论,谢谢!)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。