2009/04/21

PL/SQL - 統一編號檢查

set serveroutput on;
declare
  check_flg BOOLEAN:= FALSE;
  tax_ref PLS_INTEGER;
  e_null EXCEPTION;
  e_eight_char EXCEPTION;
  num_sum PLS_INTEGER:=0;
  --邏輯Function
  FUNCTION addition(v_index IN PLS_INTEGER,v_num IN PLS_INTEGER) RETURN PLS_INTEGER IS
    a_int PLS_INTEGER:=0;
  BEGIN
     CASE
       WHEN v_index = (7) THEN
          a_int := v_num * 4;
       WHEN v_index in (2,4,6) THEN
          a_int := v_num * 2;
       ELSE
          a_int := v_num;
     END CASE;
     --return a_int;
     RETURN trunc(a_int / 10) + MOD(a_int,10);
  END addition;
BEGIN
  tax_ref := to_number('86533770');
  --空值檢查
  IF tax_ref IS NULL THEN
     RAISE e_null;
  END IF;
  --8碼檢查
  IF length(tax_ref) <> 8 THEN
     RAISE e_eight_char;
  END IF;
  --邏輯檢查
  FOR i IN 1..length(tax_ref) LOOP
      num_sum := num_sum + addition(i,substr(tax_ref,i,1));
  END LOOP;
  if mod(num_sum,10) = 0 then
     check_flg := TRUE;
  elsif substr(tax_ref,6,1) = 7 then
     if mod(num_sum,9) = 0 then
       check_flg := TRUE;
     end if;
  end if;
  --顯示是否通過檢查
  if check_flg = TRUE then
     dbms_output.put_line('True');
  else
     dbms_output.put_line('False');
  end if;
--例外處理
EXCEPTION
  WHEN e_null THEN
    dbms_output.put_line('空值');
  WHEN e_eight_char THEN
    dbms_output.put_line('並非8碼數字');
  WHEN OTHERS THEN
    dbms_output.put_line('錯誤統編');
END;

沒有留言: