-- 법인번호 체크
SELECT
DECODE(G7, 10 - MOD(G1 + G2 + G3 + G4 + G5 + G6 + G11 + G12 + G13 + G14 + G15 + G16,10), '정상', '비정상')
FROM (
SELECT
SUBSTR(TTA103_INC_NO,1,1) * 1 AS G1
,SUBSTR(TTA103_INC_NO,2,1) * 2 AS G2
,SUBSTR(TTA103_INC_NO,3,1) * 1 AS G3
,SUBSTR(TTA103_INC_NO,4,1) * 2 AS G4
,SUBSTR(TTA103_INC_NO,5,1) * 1 AS G5
,SUBSTR(TTA103_INC_NO,6,1) * 2 AS G6
,SUBSTR(TTA103_INC_NO,7,1) * 1 AS G11
,SUBSTR(TTA103_INC_NO,8,1) * 2 AS G12
,SUBSTR(TTA103_INC_NO,9,1) * 1 AS G13
,SUBSTR(TTA103_INC_NO,10,1) * 2 AS G14
,SUBSTR(TTA103_INC_NO,11,1) * 1 AS G15
,SUBSTR(TTA103_INC_NO,12,1) * 2 AS G16
,SUBSTR(TTA103_INC_NO,13,1) * 1 AS G7
FROM ODS_USER.FTA103T
WHERE TTA103_INC_NO IS NOT NULL
AND ROWNUM = 1
);
-- 법인번호 생성규칙
오류검색번호 산출방식
1. 등기관서별 분류번호, 법인종류별 분류번호 및 일련번호를 차례로 연결한 12자리의 숫자를 만든다.
(예시)
1 1 0 1 1 1 - 0 0 6 2 4 3
----- --- -----------
| | |
+--------+---------+------------------ 등기관서별 분류번호
| |
+---------+------------------ 법인종류별 분류번호
|
+------------------ 일련번호
2. 각 숫자에 차례로 1과 2를 곱한 값을 모두 더하여 합을 구한다.
(예시)
1 1 0 1 1 1 - 0 0 6 2 4 3
×1 2 1 2 1 2 - 1 2 1 2 1 2
----------------------------
1 2 0 2 1 2 0 0 6 4 4 6
1 + 2 + 2 + 1 + 2 + 6 + 4 + 4 + 6= 28
3. 합을 10으로 나누어 몫과 나머지를 구한다.
(예시) 28 ÷ 10 = 2 나머지 8
4. 10에서 나머지를 뺀 값을 오류검색번호로 한다.
다만 10에서 나머지를 뺀 값이 10인 때에는 0을 오류검색번호로 한다.
(예시) 10 - 8 = 2 ------ 오류검색번호
-- 사업자 번호 체크
SELECT DECODE(MOD(TO_NUMBER(SUBSTR(:biz_num,1,1)) +
MOD(TO_NUMBER(SUBSTR(:biz_num,2,1))*3, 10) +
MOD(TO_NUMBER(SUBSTR(:biz_num,3,1))*7, 10) +
MOD(TO_NUMBER(SUBSTR(:biz_num,4,1))*1, 10) +
MOD(TO_NUMBER(SUBSTR(:biz_num,5,1))*3, 10) +
MOD(TO_NUMBER(SUBSTR(:biz_num,6,1))*7, 10) +
MOD(TO_NUMBER(SUBSTR(:biz_num,7,1))*1, 10) +
MOD(TO_NUMBER(SUBSTR(:biz_num,8,1))*3, 10) +
FLOOR(TO_NUMBER(SUBSTR(:biz_num,9,1))*5/10) +
MOD(TO_NUMBER(SUBSTR(:biz_num,9,1))*5,10) +
TO_NUMBER(SUBSTR(:biz_num,10,1)), 10),0, 'Valid','Not Valid') VALID
FROM DUAL
-- 사업자번호 생성규칙
1. 청·서코드(3자리)
순수한 신규개업자(폐업 후 재개업이 아닌 자)에게만 사업자등록번호 최초 부여관서의 청·서코드를 부여하며 관서간 세적이전, 관할구역 변경의 경우에는 청·서코드 변경을 하지 아니한다.
2. 개인·법인 구분코드(2자리)
가. 개인구분 코드
(1) 개인과세사업자 특정동 구별 없이 01부터 79까지를 순차적으로 부여
(2) 개인면세사업자 산업구분없이 90부터 99까지를 순차적으로 부여
(3) 소득세법 제1조 제3항에 해당하는 법인이 아닌 종교 단체 …89
(4) 소득세법 제1조 제3항에 해당하는 자로서 "ⓒ"이외의 자(아파트관리사무소 등) 및 영 제7조 제6항의 규정에 의하여 등록한 다단계 판매업자 …80
나. 법인성격코드:법인에 대하여는 성격별 코드를 구분하여 사용한다.
(1) 영리법인의 본점 …81.86
(2) 비영리법인의 본점 및 지점(법인격 없는 사단, 재단, 기타단체중 법인으로 보는 단체를 포함) …82
(3) 국가, 지방자치단체, 지방자치단체조합 … 83
(4) 외국법인의 본·지점 및 연락사무소 … 84
(5) 영리법인의 지점 …85
3. 일련번호코드(4자리) 과세사업자(일반·간이·특례), 면세사업자, 법인사업자별로 등록 또는 지정일자순으로 사용 가능한 번호를 0001~9999로 부여한다. 다만, 비영리법인의 본·지점은 등록 또는 지정일자순으로 0001~5999로 부여하고, 국세기본법 제13조 제2항의 규정에 의하여 법인으로 보는 단체는 6000~9999로 부여한다.
4. 검증번호(1위) 전산시스템에 의하여 사업자등록번호의 오류여부를 검증하기 위하여 부여된 특정숫자이다.
③ 폐업 후 재개업의 경우에도 종전의 사업자 등록번호를 변경 없이 사용한다. 다만, 2개 이상의 사업자등록번호를 가진 사업자가 폐업하고 추후 사업자등록을 신청하는 경우에는 사업자등록 신청일로부터 1년이 경과한 등록번호 중 가장 최근에 폐업한 사업장의 사업자등록번호부터 소급하여 순차적으로 부여한다. 이 경우 공동사업자에게 부여하였던 사업자등록번호는 재사용하지 아니한다.
사업자 등록번호의 의미
사업자 번호는 000 - 00 - 00000 으로 되어 있는데
처음 3자리는 지역을 의미합니다.
서울,경기청 100
중구청 200
대전청 300
광주청 400
대구청 500
부산청 600
두번째 2자리는
개인,법인,면세,비영리를 구분합니다.
01~80 은 개인사업자
81 영리법인
82 비영리법인
83 학교법인,지자체
84 외국법인
85 지점법인
86 서울경기의 영리법인
90~99 개인면세사업(쌀, 고기,어물,치과, 의원등)
셋째 5자리는 일련 번호를 의미합니다.
-- 주민번호 체크
SELECT DECODE( MOD(11 - MOD(TOT,11),10), L7,'Valid','Not Valid')
FROM
(SELECT TO_NUMBER(SUBSTR(:ssn,1,1)*2 +
SUBSTR(:ssn,2,1)*3 +
SUBSTR(:ssn,3,1)*4 +
SUBSTR(:ssn,4,1)*5 +
SUBSTR(:ssn,5,1)*6 +
SUBSTR(:ssn,6,1)*7 +
SUBSTR(:ssn,7,1)*8 +
SUBSTR(:ssn,8,1)*9 +
SUBSTR(:ssn,9,1)*2 +
SUBSTR(:ssn,10,1)*3 +
SUBSTR(:ssn,11,1)*4 +
SUBSTR(:ssn,12,1)*5 ) TOT,
TO_NUMBER(SUBSTR(:ssn,13,1)) L7
FROM DUAL) VALID
주민번호,외국인번호,사업자번호 체크 Script
1. 주민등록번호
2. 재외국인 등록번호
3. 사업자등록번호
등의 진위 여부를 체크할 수 있는 JavaScript입니다.
(정통부(?)에서 공개되어있던 스크립트일겁니다...)
사용법은
check_fgnno('외국인번호13자리');
check_juminno('주민번호13자리');
check_busino('사업자번호10자리');
----------------------------------------------------
<!--
// 재외국인 번호 체크
function check_fgnno(fgnno) {
var sum=0;
var odd=0;
buf = new Array(13);
for(i=0; i<13; i++) { buf[i]=parseInt(fgnno.charAt(i)); }
odd = buf[7]*10 + buf[8];
if(odd%2 != 0) { return false; }
if( (buf[11]!=6) && (buf[11]!=7) && (buf[11]!=8) && (buf[11]!=9) ) {
return false;
}
multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
for(i=0, sum=0; i<12; i++) { sum += (buf[i] *= multipliers[i]); }
sum = 11 - (sum%11);
if(sum >= 10) { sum -= 10; }
sum += 2;
if(sum >= 10) { sum -= 10; }
if(sum != buf[12]) { return false }
return true;
}
// 주민번호 체크
function check_juminno(juminno) {
if(juminno=="" || juminno==null || juminno.length!=13) {
alert("주민등록번호를 적어주세요.");
return false;
}
var jumin1 = juminno.substr(0,6);
var jumin2 = juminno.substr(6,7);
var yy = jumin1.substr(0,2); // 년도
var mm = jumin1.substr(2,2); // 월
var dd = jumin1.substr(4,2); // 일
var genda = jumin2.substr(0,1); // 성별
var msg, ss, cc;
// 숫자가 아닌 것을 입력한 경우
if (!isNumeric(jumin1)) {
alert("주민등록번호 앞자리를 숫자로 입력하세요.");
return false;
}
// 길이가 6이 아닌 경우
if (jumin1.length != 6) {
alert("주민등록번호 앞자리를 다시 입력하세요.");
return false;
}
// 첫번째 자료에서 연월일(YYMMDD) 형식 중 기본 구성 검사
if (yy < "00" || yy > "99" ||
mm < "01" || mm > "12" ||
dd < "01" || dd > "31") {
alert("주민등록번호 앞자리를 다시 입력하세요.");
return false;
}
// 숫자가 아닌 것을 입력한 경우
if (!isNumeric(jumin2)) {
alert("주민등록번호 뒷자리를 숫자로 입력하세요.");
return false;
}
// 길이가 7이 아닌 경우
if (jumin2.length != 7) {
alert("주민등록번호 뒷자리를 다시 입력하세요.");
return false;
}
// 성별부분이 1 ~ 4 가 아닌 경우
if (genda < "1" || genda > "4") {
alert("주민등록번호 뒷자리를 다시 입력하세요.");
return false;
}
// 연도 계산 - 1 또는 2: 1900년대, 3 또는 4: 2000년대
cc = (genda == "1" || genda == "2") ? "19" : "20";
// 첫번째 자료에서 연월일(YYMMDD) 형식 중 날짜 형식 검사
if (isYYYYMMDD(parseInt(cc+yy), parseInt(mm), parseInt(dd)) == false) {
alert("주민등록번호 앞자리를 다시 입력하세요.");
return false;
}
// Check Digit 검사
if (!isSSN(jumin1, jumin2)) {
alert("입력한 주민등록번호를 검토한 후, 다시 입력하세요.");
return false;
}
return true;
}
// 사업자등록번호 체크
function check_busino(vencod) {
var sum = 0;
var getlist =new Array(10);
var chkvalue =new Array("1","3","7","1","3","7","1","3","5");
for(var i=0; i<10; i++) { getlist[i] = vencod.substring(i, i+1); }
for(var i=0; i<9; i++) { sum += getlist[i]*chkvalue[i]; }
sum = sum + parseInt((getlist[8]*5)/10);
sidliy = sum % 10;
sidchk = 0;
if(sidliy != 0) { sidchk = 10 - sidliy; }
else { sidchk = 0; }
if(sidchk != getlist[9]) { return false; }
return true;
}
function isYYYYMMDD(y, m, d) {
switch (m) {
case 2: // 2월의 경우
if (d > 29) return false;
if (d == 29) {
// 2월 29의 경우 당해가 윤년인지를 확인
if ((y % 4 != 0) || (y % 100 == 0) && (y % 400 != 0))
return false;
}
break;
case 4: // 작은 달의 경우
case 6:
case 9:
case 11:
if (d == 31) return false;
}
// 큰 달의 경우
return true;
}
function isNumeric(s) {
for (i=0; i<s.length; i++) {
c = s.substr(i, 1);
if (c < "0" || c > "9") return false;
}
return true;
}
function isLeapYear(y) {
if (y < 100)
y = y + 1900;
if ( (y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0) ) {
return true;
} else {
return false;
}
}
function getNumberOfDate(yy, mm) {
month = new Array(29,31,28,31,30,31,30,31,31,30,31,30,31);
if (mm == 2 && isLeapYear(yy)) mm = 0;
return month[mm];
}
function isSSN(s1, s2) {
n = 2;
sum = 0;
for (i=0; i<s1.length; i++)
sum += parseInt(s1.substr(i, 1)) * n++;
for (i=0; i<s2.length-1; i++) {
sum += parseInt(s2.substr(i, 1)) * n++;
if (n == 10) n = 2;
}
c = 11 - sum % 11;
if (c == 11) c = 1;
if (c == 10) c = 0;
if (c != parseInt(s2.substr(6, 1))) return false;
else return true;
}
[출처] 법인번호, 사업자등록번호, 주민번호 체크 SQL|작성자 혁군\
--------------------------------------------------------------------------------------------------
'닷컴's_열공 > Database' 카테고리의 다른 글
오라클 프로시져 호출하기 OUT이 있는 경우 (0) | 2020.03.18 |
---|---|
Oracle - Split 방식, 문자열의 세로 분리 - 참조 (0) | 2019.03.20 |
mybatis lt gt lte gte 정리 (0) | 2019.01.28 |
내국인/외국인 주민등록번호 유효성 검사 함수 (주민번호, 검출, SQL) (0) | 2019.01.22 |
SQL 세로를 가로로 만들기 참조... (0) | 2017.07.24 |