通過輸入的前17位社會安全號碼碼擷取最後一位身份證校正碼的函數,輸出為校正碼的值。
create or replace function getCheckCode(Identity_code VARCHAR2)RETURN VARCHAR2/*****author :Mr_wu******version :1.0.0.1******function:通過輸入的17位或18位元字計算最後一位驗證位******param :input ****** Identity_code 17位或者18位的驗證位******/ASlast_code VARCHAR2(255);--返回字串sum_num number ; --位權與相應位值的乘積的和flag NUMBER(1) ;NotEnoughLengthInput EXCEPTION ;--異常處理,輸入參數是否符合要求BEGIN --判斷是否是數字 SELECT isnumeric(substr(Identity_code,1,17)) INTO flag FROM dual ; IF flag = 0 THEN RAISE NotEnoughLengthInput ; end if ; --初始化求和變數 sum_num := 0 ; --判斷位長是否達到身份證的要求 IF LENGTH(Identity_code) = 18 OR length(Identity_code) = 17 THEN FOR i IN 1..17 LOOP sum_num := sum_num + substr(Identity_code,i,1)*mod(POWER(2,(18-i)),11) ; END LOOP ; --根據計算的和在求模運算找到對應驗證碼 SELECT decode(MOD(sum_num,11),0,'1', 1,'0', 2,'X', 3,'9', 4,'8', 5,'7', 6,'6', 7,'5', 8,'4', 9,'3', 10,'2') INTO last_code FROM dual ; IF LENGTH(Identity_code) = 18 AND substr(Identity_code,18,1) <> last_code THEN last_code := last_code||',您輸入的最後一位驗證位不正確!' ; END IF ; ELSE RAISE NotEnoughLengthInput ; END if ; RETURN '最後一位驗證位為:'||last_code ; --異常捕獲 EXCEPTION WHEN NotEnoughLengthInput THEN last_code := '請輸入17位或18位元字進行驗證!' ; RETURN last_code ; END getCheckCode ;
判斷輸入的前17位字串是否為數位函數:
CREATE OR REPLACE FUNCTION isnumeric(str IN VARCHAR2) RETURN NUMBERIS------------return 0 非數字或者為空白 return 1 數字------------- v_str NUMBER;BEGIN IF str IS NULL THEN RETURN 0; ELSE BEGIN SELECT TO_NUMBER(str) INTO v_str FROM DUAL; EXCEPTION WHEN INVALID_NUMBER THEN RETURN 0; END; RETURN 1; END IF;END isnumeric;
效果圖: