oracle 中身份证号15位升18位
来源:互联网 发布:淘宝网卖家开店流程 编辑:程序博客网 时间:2024/04/29 04:28
CREATE OR REPLACE FUNCTION FUNC_AAC00215_18 (prm_aac002 varchar2)
return varchar2 is
ll_i number(4) := 18;
ll_row number(5) := 0;
var_aac002 varchar2(18);
ll_sfz18 number(3);
ll_sfz varchar2(3);
var_sfz18 varchar(18);
var_date varchar(10);
dat_date date;
ll_num number(2);
s_sfz varchar2(15);
s_sss varchar2(20):='X';
v_newaac002 varchar(18);
n_length number(2);
V_CHAR varchar2(15);
s_date varchar2(15);
begin
if prm_aac002 is null then
return'';
end if;
if length(prm_aac002) <> 15 then
--return'';
return prm_aac002;
end if;
/** --身份证号为18位时的校验
if length(prm_aac002) = 18 then
n_length := length(prm_aac002);
FOR n_i IN 1 .. n_length LOOP
V_CHAR := SUBSTR(prm_aac002, n_i, 1);
IF V_CHAR IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') AND N_I<18 THEN
v_newaac002 :=prm_aac002;
ELSIF N_I=18 AND V_CHAR IN('0', '1', '2', '3', '4', '5', '6', '7', '8', '9','X') THEN
v_newaac002 :=prm_aac002;
else
return'含义非法字符!';
END IF;
END LOOP;
-- 取出生日期是否有效
s_date := substr(prm_aac002, 7, 8);
begin
select to_date(s_date, 'yyyymmdd') into dat_date from dual;
exception
when others then
return'出生日期不对!';
end;
if substr(prm_aac002,7, 2)>20 or substr(prm_aac002,7, 2) <19 then
return'年度不对!';
end if;
--3. 最后位效验
while n_length >= 2 loop
begin
select to_number(substr(prm_aac002, 19 - n_length, 1))
into ll_num
from dual;
exception
when others then
return'';
end;
ll_row := ll_row + mod(power(2, (n_length - 1)), 11) *
to_number(substr(prm_aac002, 19 - n_length, 1));
n_length := n_length - 1;
end loop;
ll_sfz18 := mod(ll_row, 11);
select decode(to_char(ll_sfz18),'0','1','1','0','2','X','3','9','4','8','5','7','6','6','7','5','8','4','9','3','10','2')
into ll_sfz
from dual;
if ll_sfz <> substr(prm_aac002,18, 1) then
return'尾数不对!应为'||ll_sfz;
end if;
RETURN v_newaac002;
end if;
*/
if prm_aac002 = '111111111111111111'then
return'';
end if;
if s_sfz <>'X'then
s_sss := s_sfz;
else
s_sss := prm_aac002;
end if;
if length(prm_aac002)=15 then
var_date := '19' || substr(s_sss, 7, 6); --632127 651010 001
begin
select to_date(var_date, 'yyyymmdd') into dat_date from dual;
exception
when others then
return'';
end;
var_aac002 := substr(s_sss, 0, 6) || '19' ||
substr(s_sss, 7, 9);
while ll_i >= 2 loop
begin
select to_number(substr(var_aac002, 19 - ll_i, 1))
into ll_num
from dual;
exception
when others then
return'';
end;
ll_row := ll_row + mod(power(2, (ll_i - 1)), 11) *
to_number(substr(var_aac002, 19 - ll_i, 1));
ll_i := ll_i - 1;
end loop;
ll_sfz18 := mod(ll_row, 11);
select decode(to_char(ll_sfz18),'0','1','1','0','2','X','3','9','4','8','5','7','6','6','7','5','8','4','9','3','10','2')
into ll_sfz
from dual;
var_sfz18 := var_aac002 || ll_sfz;
return var_sfz18;
end if;
end func_aac00215_18;
--SELECT func_aac00215_18('371102841104258') FROM dual;
- oracle 中身份证号15位升18位
- 15位的身份证号转为18位
- 15位身份证号转18位
- 身份证号转换15位与18位
- 身份证号15位转18位
- 身份证号:15位转为18位
- 汇总15位身份证号和18位身份证号的区别
- 15位身份证号转换为18位身份证号
- 身份证号15->18位
- ORCLE 中15位身份证号转18为存储过程
- Java 将15位身份证号转化为18位返回,非15位身份证号原值返回
- Excel中如何将15位身份证号转换为18位
- php 身份证号15和18位验证
- 身份证号 15位与18位间的转换
- 15位身份证号转18位word 宏代码
- 15位身份证号转18位VB代码
- java-15位身份证号升级到18位
- mysql中将15位身份证号改为18位
- C语言数组练习
- Linux的automake出现的问题(Makefile.am: C objects in subdir but `AM_PROG_CC_C_O' not in `configure.ac')
- JavaScript中JSON使用
- 打印js插件
- C&OC的数据类型分类
- oracle 中身份证号15位升18位
- spring_ThreadPoolTaskExecutor和jdk1_7_ThreadPoolExecutor原理解析
- Ubuntu下usb设备读写权限设置
- AspectJ使用注解方式报错
- Cpp--sizeof与strlen区别与联系
- hbase Region 的学习
- 移动端、手机网站中文输入法下keyup事件部分按键无效
- U盘无法格式的解决办法
- CentOS6.5中修改yum源