Oracle中15位身份证转18位存储过程
2008-02-28 09:49
363 查看
procedure :
create or replace procedure PROC_PID15TO18(pid in varchar2, tabName in varchar2) is
v_sqlerrm varchar2(500);
v_sql varchar2(200);
BEGIN
v_sql:='UPDATE ' || tabName || ' SET ' || pid || '=' ||
' CASE WHEN LENGTH(' || pid || ')=15 THEN ' ||
'FUN_PID15TO18(' || pid || ')' ||
' WHEN LENGTH(' || pid || ')=18 THEN ' ||
pid ||
' ELSE ' ||
'''000000000000000000''' ||
' END ';
EXECUTE IMMEDIATE v_sql;
COMMIT;
EXCEPTION
when others then
v_sqlerrm := substr(SQLERRM, 1, 300);
dbms_output.put_line('ERR=' || v_sqlerrm);
rollback;
end PROC_PID15TO18;
function :
create or replace function FUN_PID15TO18(pid15 in char) return char is
TYPE array_17_number IS VARRAY(17) OF NUMBER;
TYPE array_11_char IS VARRAY(11) OF char;
Result varchar2(18);
v_check_number integer := 0;
v_check_char char(1);
v_factor array_17_number := array_17_number(7,
9,
10,
5,
8,
4,
2,
1,
6,
3,
7,
9,
10,
5,
8,
4,
2);
v_mod array_11_char := array_11_char('1',
'0',
'X',
'9',
'8',
'7',
'6',
'5',
'4',
'3',
'2');
begin
if (length(pid15) = 18) then
return pid15;
elsif (length(pid15) = 15) then
result := substr(pid15, 1, 6) || '19' || substr(pid15, 7, 9);
FOR i IN 1 .. 17 LOOP
v_check_number := to_number(substr(result, i, 1)) * v_factor(i) +
v_check_number;
END LOOP;
v_check_number := mod(v_check_number, 11);
v_check_char := v_mod(v_check_number + 1);
result := result || v_check_char;
return result;
else
raise_application_error(-20001, 'Length of pid should be 15 or 18!');
end if;
end FUN_PID15TO18;
create or replace procedure PROC_PID15TO18(pid in varchar2, tabName in varchar2) is
v_sqlerrm varchar2(500);
v_sql varchar2(200);
BEGIN
v_sql:='UPDATE ' || tabName || ' SET ' || pid || '=' ||
' CASE WHEN LENGTH(' || pid || ')=15 THEN ' ||
'FUN_PID15TO18(' || pid || ')' ||
' WHEN LENGTH(' || pid || ')=18 THEN ' ||
pid ||
' ELSE ' ||
'''000000000000000000''' ||
' END ';
EXECUTE IMMEDIATE v_sql;
COMMIT;
EXCEPTION
when others then
v_sqlerrm := substr(SQLERRM, 1, 300);
dbms_output.put_line('ERR=' || v_sqlerrm);
rollback;
end PROC_PID15TO18;
function :
create or replace function FUN_PID15TO18(pid15 in char) return char is
TYPE array_17_number IS VARRAY(17) OF NUMBER;
TYPE array_11_char IS VARRAY(11) OF char;
Result varchar2(18);
v_check_number integer := 0;
v_check_char char(1);
v_factor array_17_number := array_17_number(7,
9,
10,
5,
8,
4,
2,
1,
6,
3,
7,
9,
10,
5,
8,
4,
2);
v_mod array_11_char := array_11_char('1',
'0',
'X',
'9',
'8',
'7',
'6',
'5',
'4',
'3',
'2');
begin
if (length(pid15) = 18) then
return pid15;
elsif (length(pid15) = 15) then
result := substr(pid15, 1, 6) || '19' || substr(pid15, 7, 9);
FOR i IN 1 .. 17 LOOP
v_check_number := to_number(substr(result, i, 1)) * v_factor(i) +
v_check_number;
END LOOP;
v_check_number := mod(v_check_number, 11);
v_check_char := v_mod(v_check_number + 1);
result := result || v_check_char;
return result;
else
raise_application_error(-20001, 'Length of pid should be 15 or 18!');
end if;
end FUN_PID15TO18;
相关文章推荐
- oracle 自定义身份证15位转18位 函数
- [导入]Oracle常用函数:IDCARD15TO18() 身份证15位转18位函数
- oracle 中身份证号15位升18位
- oracle pl/sql身份证15位转18位的function
- Oracle常用函数:IDCARD15TO18() 身份证15位转18位函数
- 15位身份证升18位身份证的Oracle函数
- oracle的存储过程实现字段类型的替换
- oracle 存储过程中 动态游标
- 如何实现在Oracle中应用存储过程调用MatLab函数(3)
- Oracle_存储过程
- Java调用Oracle集合类型输出参数的存储过程
- oracle 一种从按照某个字段排序获取连续的区间值得存储过程写法
- oracle 存储过程
- 简单的关于身份证(15位或者18位)合法性验证
- [置顶] Oracle job procedure 存储过程定时任务
- ibatis 调用有返回集合的存储过程 oracle
- 常规Oracle语句与存储过程语句
- oracle 存储过程的基本语法 及注意事项
- 如何在Oracle中使用Java存储过程(详解)
- 在存储过程中执行oracle循环语句