CREATE OR REPLACE FUNCTION FUN_CHECKIDCARD(PI_AAC002 VARCHAR2)
RETURN VARCHAR2 IS
/******************************************************************************
* 程序名:身份證合法性校驗FUN_CHECKIDCARD
* 程序功能:對人員的身份證合法性進行校驗
* 輸入:身份證號碼
* 輸出:返回值: 0 合法;
* 版本日期:2015-01-16
* 執行類型:用戶手工執行
* 修改過程:
******************************************************************************/
TYPE UDT_CHECK IS TABLE OF NUMBER;
UDO_CHECK UDT_CHECK := UDT_CHECK(7,
9,
10,
5,
8,
4,
2,
1,
6,
3,
7,
9,
10,
5,
8,
4,
2); --初始化校驗位
L_RESULT NUMBER := 0;
L_STR NUMBER;
BEGIN
--15位身份證
IF LENGTHB(PI_AAC002) = 15 THEN
--身份證號不對
IF FUN_ISDATE('19' || SUBSTR(PI_AAC002, 7, 6)) = 0 THEN
RETURN 1;
END IF;
IF FUN_ISNUMBER(PI_AAC002) = 0 THEN
RETURN 2;
END IF;
--18位身份證
ELSIF LENGTHB(PI_AAC002) = 18 THEN
IF FUN_ISDATE(SUBSTR(PI_AAC002, 7, 8)) = 0 THEN
RETURN 3;
END IF;
IF FUN_ISNUMBER(SUBSTR(PI_AAC002, 1, 17)) = 0 THEN
RETURN 4;
END IF;
IF FUN_ISNUMBER(SUBSTR(PI_AAC002, 18, 1)) = 0 OR
SUBSTR(PI_AAC002, 18, 1) <> 'x' OR SUBSTR(PI_AAC002, 18, 1) <> 'X' THEN
RETURN 5;
END IF;
--驗證校驗位開始
FOR I IN 1 .. LENGTH(PI_AAC002) - 1 LOOP
L_STR := SUBSTR(PI_AAC002, I, 1);
L_RESULT := L_RESULT + L_STR * UDO_CHECK(I);
END LOOP;
L_STR := MOD(L_RESULT, 11);
SELECT DECODE(L_STR,
0,
1,
1,
0,
2,
'X',
3,
9,
4,
8,
5,
7,
6,
6,
7,
5,
8,
4,
9,
3,
10,
2)
INTO L_RESULT
FROM DUAL;
IF SUBSTR(PI_AAC002, LENGTH(PI_AAC002), 1) <> L_RESULT THEN
RETURN 7;
ELSE
RETURN 0;
END IF;
ELSE
RETURN 6;
END IF;
RETURN 0;
END FUN_CHECKIDCARD;
其中FUN_ISDATE 與FUN_ISNUMBER分別是判斷是否是時間或着數據的函數:
CREATE OR REPLACE FUNCTION FUN_ISDATE(PI_PARAMETER VARCHAR2)
RETURN VARCHAR2 IS
L_VAL DATE;
BEGIN
L_VAL := TO_DATE(NVL(PI_PARAMETER, 'a'), 'yyyy-mm-dd hh24:mi:ss');
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END FUN_ISDATE;
CREATE OR REPLACE FUNCTION FUN_ISNUMBER(PI_PARAMETER VARCHAR2)
RETURN VARCHAR2 IS
L_VAL NUMBER;
BEGIN
L_VAL := TO_NUMBER(NVL(PI_PARAMETER, 'a'));
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END FUN_ISNUMBER;