oracle_函数身份证15位转18位

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;







FUNCTION GET_NEWCERT(
OLDCERT IN VARCHAR2)
RETURN VARCHAR2
IS
NEW_CERT VARCHAR2(20);
OLD_CERT VARCHAR2(17);
I NUMBER;
SUMID NUMBER;
CHECKID VARCHAR2(34);
ENDID VARCHAR2(11);
BEGIN
ENDID :='10X98765432';
CHECKID :='0709100508040201060307091005080402';
SUMID :=0;
OLD_CERT :=SUBSTR(OLDCERT,1,6)||'19'||SUBSTR(OLDCERT,7,9);
IF LENGTH(OLDCERT)=15 AND FHTS_DATE.IS_DATE(SUBSTR(OLD_CERT,7,8))=0 THEN
FOR I IN 1..17
LOOP
SUMID:=SUMID+TO_NUMBER(SUBSTR(OLD_CERT,I,1))*TO_NUMBER(SUBSTR(CHECKID,I*2-1,2));
END LOOP;
NEW_CERT:= OLD_CERT||SUBSTR(ENDID,MOD(SUMID,11)+1,1);
ELSE
NEW_CERT:=OLDCERT;
END IF;
RE

TURN NEW_CERT;
END GET_NEWCERT;

相关文档
最新文档