自定义函数的几个特殊问题解决

计算连续0的最大个数

select max(length(REGEXP_SUBSTR(str, '[^1]+', 1, LEVEL))) STR
  from (select '100010100000000' str from dual)
CONNECT BY LEVEL <= REGEXP_COUNT(str, '[^1]+');

 

身份证号码校验

CREATE OR REPLACE FUNCTION fn_checkCERT_NO (p_CERT_NO IN VARCHAR2) RETURN INT
IS
   v_regstr      VARCHAR2 (2000);
   v_sum         NUMBER;
   v_mod         NUMBER;
   v_checkcode   CHAR (11)       := '10X98765432';
   v_checkbit    CHAR (1);
   v_areacode    VARCHAR2 (2000) := '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';
BEGIN
   CASE LENGTHB (p_CERT_NO)
      WHEN 15
      THEN                                                            -- 15位
         IF INSTRB (v_areacode, SUBSTR (p_CERT_NO, 1, 2) || ',') = 0 THEN
            RETURN 0;
         END IF;

         IF MOD (TO_NUMBER (SUBSTRB (p_CERT_NO, 7, 2)) + 1900, 400) = 0
            OR 
            (
                MOD (TO_NUMBER (SUBSTRB (p_CERT_NO, 7, 2)) + 1900, 100) <> 0
                AND 
                MOD (TO_NUMBER (SUBSTRB (p_CERT_NO, 7, 2)) + 1900, 4) = 0
            )
         THEN                                                          -- 闰年
            v_regstr :=
               '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$';
         ELSE
            v_regstr :=
               '^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$';
         END IF;

         IF REGEXP_LIKE (p_CERT_NO, v_regstr) THEN
            RETURN 1;
         ELSE
            RETURN 0;
         END IF;
      WHEN 18
      THEN                                                             -- 18位
         IF INSTRB (v_areacode, SUBSTRB (p_CERT_NO, 1, 2) || ',') = 0 THEN
            RETURN 0;
         END IF;
        
         IF MOD (TO_NUMBER (SUBSTRB (p_CERT_NO, 7, 4)), 400) = 0
            OR 
            (
                MOD (TO_NUMBER (SUBSTRB (p_CERT_NO, 7, 4)), 100) <> 0
                AND 
                MOD (TO_NUMBER (SUBSTRB (p_CERT_NO, 7, 4)), 4) = 0
            )
         THEN                                                          -- 闰年
            v_regstr :=
               '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$';
         ELSE
            v_regstr :=
               '^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$';
         END IF;

         IF REGEXP_LIKE (p_CERT_NO, v_regstr) THEN
            v_sum :=
                   (  TO_NUMBER (SUBSTRB (p_CERT_NO, 1, 1))
                    + TO_NUMBER (SUBSTRB (p_CERT_NO, 11, 1))
                   )
                 * 7
               +   (  TO_NUMBER (SUBSTRB (p_CERT_NO, 2, 1))
                    + TO_NUMBER (SUBSTRB (p_CERT_NO, 12, 1))
                   )
                 * 9
               +   (  TO_NUMBER (SUBSTRB (p_CERT_NO, 3, 1))
                    + TO_NUMBER (SUBSTRB (p_CERT_NO, 13, 1))
                   )
                 * 10
               +   (  TO_NUMBER (SUBSTRB (p_CERT_NO, 4, 1))
                    + TO_NUMBER (SUBSTRB (p_CERT_NO, 14, 1))
                   )
                 * 5
               +   (  TO_NUMBER (SUBSTRB (p_CERT_NO, 5, 1))
                    + TO_NUMBER (SUBSTRB (p_CERT_NO, 15, 1))
                   )
                 * 8
               +   (  TO_NUMBER (SUBSTRB (p_CERT_NO, 6, 1))
                    + TO_NUMBER (SUBSTRB (p_CERT_NO, 16, 1))
                   )
                 * 4
               +   (  TO_NUMBER (SUBSTRB (p_CERT_NO, 7, 1))
                    + TO_NUMBER (SUBSTRB (p_CERT_NO, 17, 1))
                   )
                 * 2
               + TO_NUMBER (SUBSTRB (p_CERT_NO, 8, 1)) * 1
               + TO_NUMBER (SUBSTRB (p_CERT_NO, 9, 1)) * 6
               + TO_NUMBER (SUBSTRB (p_CERT_NO, 10, 1)) * 3;
            v_mod := MOD (v_sum, 11);
            v_checkbit := SUBSTRB (v_checkcode, v_mod + 1, 1);

            IF v_checkbit = upper(substrb(p_CERT_NO,18,1)) THEN
               RETURN 1;
            ELSE
               RETURN 0;
            END IF;
         ELSE
            RETURN 0;
         END IF;
      ELSE
         RETURN 0;                                      -- 身份证号码位数不对
   END CASE;
EXCEPTION
   WHEN OTHERS
   THEN
      RETURN 0;
END fn_checkCERT_NO;

 

字符串过长使用clob连接存储

create or replace function fun_clob_concat(dest_lob  clob,
lc_clob1  clob:=to_clob(' '),
lc_clob2  clob:=to_clob(' '),
lc_clob3  clob:=to_clob(' ')
 )
return clob
 as
v_dest_lob clob;
begin
--dbms_lob.createtemporary(v_dest_lob,TRUE);
v_dest_lob :=dest_lob;
dbms_lob.append(v_dest_lob,  lc_clob1);
dbms_lob.append(v_dest_lob,  lc_clob2);
dbms_lob.append(v_dest_lob,  lc_clob3);
return v_dest_lob;
end;

 

转载于:https://www.cnblogs.com/kevinlucky/p/6889957.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值