oracle 身份證 校驗位 判斷字串是否為數字函式
阿新 • • 發佈:2019-01-27
通過輸入的前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位的驗證位 ******/ AS last_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 NUMBER IS ------------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;
效果圖: