PL/SQL - 身分證檢查
http://my-plsql.blogspot.com/2009/04/plsql_22.html
參考修改成 Function
CREATE OR REPLACE FUNCTION CHK_IDN_VALID (
p_idn IN VARCHAR2
) RETURN BOOLEAN IS
p_chkflg_out BOOLEAN;
BEGIN
DECLARE
myid VARCHAR2(10); --身分證號碼
temp PLS_INTEGER;
combine_varchar2 VARCHAR2(11) := NULL;
--權重
weight_varchar2 VARCHAR2(11) := '19876543211';
FUNCTION get_prechar (
v_pre IN VARCHAR2
) RETURN VARCHAR2 IS
TYPE charTable is table of varchar2(10);
t_charTable charTable := charTable('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','X','Y','W','Z','I','O');
TYPE numberTable is table of varchar2(10);
t_numberTable numberTable := numberTable('10','11','12','13','14','15','16','17','18','19 20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35');
BEGIN
FOR i IN 1..26 LOOP
IF (t_charTable(i) = v_pre) THEN
RETURN t_numberTable(i);
END IF;
END LOOP;
END get_prechar;
BEGIN
myid := p_idn;
p_chkflg_out := false;
--長度檢查
IF (LENGTH(myid) <> 10) THEN
RETURN p_chkflg_out;
END IF;
--第一碼檢查
temp := ascii(substr(myid, 1, 1));
IF (temp <65 OR temp > 90) THEN
RETURN p_chkflg_out;
END IF;
--第二碼檢查
temp := to_number(substr(myid, 2, 1));
IF temp NOT IN ( 1, 2 ) THEN
RETURN p_chkflg_out;
END IF;
temp := 0;
combine_varchar2 := get_prechar(substr(myid, 1, 1)) || substr(myid, 2, 9);
FOR i IN 1..11 LOOP
temp := temp + (to_number(substr(combine_varchar2, i, 1)) * to_number(substr(weight_varchar2, i, 1)));
END LOOP;
IF (MOD(temp, 10) = 0) THEN
p_chkflg_out := true;
ELSE
p_chkflg_out := false;
END IF;
RETURN p_chkflg_out;
EXCEPTION
WHEN OTHERS THEN
Dbms_Output.put_line(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
RETURN p_chkflg_out;
END;
END chk_idn_valid;
-- Created on 2021/10/21 by SSC24
set SERVEROUTPUT ON
declare
-- Local variables here
i integer;
idn2 varchar2(2);
idn8 varchar2(8);
idn varchar2(10);
begin
-- Test statements here
FOR i in 0..99 LOOP
idn8 := 'F1252912';
idn2 := lpad(i,2,'0');
idn := idn8 || idn2;
IF nps.CHK_IDN_VALID (idn) THEN
Dbms_Output.put_line(idn);
END IF;
END LOOP;
end;
F125291209 F125291218 F125291227 F125291236 F125291245 F125291254 F125291263 F125291272 F125291281 F125291290 已順利完成 PL/SQL 程序.