은행 고객 관리 DB

Download Report

Transcript 은행 고객 관리 DB

은행 고객 관리 DB

-3조 32011771 이영철 32011405 강민재

은행 고객 관리 DB

테이블구조 -Customer table 고객ID(기본키), 고객이름, 고객등급(트리거)

은행 고객 관리 DB

Account table 고객ID(외래키),고개계좌(기본키),현재금액

은행 고객 관리 DB

CusInfo table 고객ID(외래키),고객계좌(외래키), 주민등록번호,주소,전화

PROGRAM STRUCTURE

은행고객관리DB 패스워드확인 보안 make_acc() 계정생성 deposit() 예금 payment() 출금 transfer() 계좌이체 balance() 잔액확인 viewInfo() 고객정보보기 ESQL

현재 테이블에 입력된 값

실행화면1

프로그램시작화면 … for(j=0;j<3;j++) { printf("관리자 확인, 패스워드 입력 : "); for(i=0;i<4;i++) { pass[i]=getch(); printf("*"); } printf("\n"); if(strncmp(password1,pass,4)==0) break; cnt+=1; if(cnt==3) exit(1); }

실행화면2

입금화면

실행화면3

출금화면

실행화면4

잔액확인

실행화면5

계좌이체

실행화면6

EXEC SQL DECLARE viewInfo CURSOR FOR SELECT C.id, A.accountNum, C.name, CI.jumin, CI.address, CI.phone, A.money FROM Customer C,Account A,CusInfo CI WHERE A.accountNum = CI.accountNum AND C.id = A.id

ORDER BY C.name,C.id; EXEC SQL OPEN viewInfo; printf("==================================고객 정보 ====================================\n"); printf("ID 이름 계좌번호 주민등록번호 주소 전화번호 잔액(\\)\n"); printf("==================================================================== ===========\n"); while(1) { EXEC SQL FETCH viewInfo INTO :id, :name, :accountNum, :jumin, :address, :phone, :money; if(NO_MORE_TUPLES) { break; } money); printf("%2d %8s %-s %s %s %s %d\n",id, name, accountNum, jumin, address, phone, } EXEC SQL CLOSE viewInfo;

실행화면6

고객정보보기(CURSOR)

뷰(view) 생성

트리거(TRIGGER)

트리거(TRIGGER)-계속

트랜잭션(TRANSACTION)1

if(money>input_money) { money-=input_money; EXEC SQL UPDATE Account SET money = :money WHERE accountNum = :search_acc; EXEC SQL COMMIT TRAN; printf("\n**출금 성공**\n");

트랜잭션(TRANSACTION)1

printf("┌──────────────────┐\n"); printf("│현재시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-15ld│\n",money); printf("└──────────────────┘\n" ); } else { printf("\n**잔액 부족. 출금 실패**\n"); EXEC SQL ROLLBACK TRAN; }

트랜잭션1 실행화면

현재 잔액보다 많은 금액을 출금액에 입력하게 되면 트랜잭션에 의해 실행이 취소된다.

트랜잭션(TRANSACTION)2

if(mymoney>input_money) { mymoney-=input_money; money+=input_money; EXEC SQL COMMIT TRAN; EXEC SQL UPDATE Account SET money=:mymoney WHERE accountNum=:self_acc; EXEC SQL UPDATE Account SET money=:money WHERE accountNum=:search_acc; printf("\n**계좌이체 성공**\n");

트랜잭션(TRANSACTION)2

printf("┌─────────────────── ──┐\n"); printf("│%-8s 님의 현재 잔액 : (\\) % 11ld│\n",myname,mymoney); printf("│%-8s 님의 현재 잔액 : (\\) % 11ld│\n",name,money); printf("└──────────────── ─────┘\n"); } else { printf("**잔액 부족, 계좌이체 실패.**\n"); EXEC SQL ROLLBACK TRAN; }

트랜잭션2 실행화면

이체할 계좌에 남아있는 금액보다 많은 금액을 이체하려고 하기때문에 트랜잭션에 의해 실행 이 취소된다.

테이블 생성 코드

CREATE TABLE Customer ( id int NOT NULL, name char(10), grade char(2), UNIQUE (id), PRIMARY KEY (id) );

테이블 생성 코드

CREATE TABLE Account ( id int, accountNum char(12) NOT NULL, money integer DEFAULT 0, UNIQUE(accountNum), PRIMARY KEY (accountNum), FOREIGN KEY (id) REFERENCES Customer(id) --ON DELETE SET NULL );

테이블 생성 코드

CREATE TABLE CusInfo ( id int, accountNum char(12), jumin char(13), address varchar(30), phone char(11) UNIQUE(jumin), FOREIGN KEY (accountNum) REFERENCES Account(accountNum) --ON DELETE SET NULL FOREIGN KEY (id) REFERENCES Customer(id) );

뷰 생성 코드

CREATE VIEW viewInfo (id, name, accountNum, jumin, address, phone, money) AS SELECT C.id, C.name, A.accountNum, CI.jumin, CI.address, CI.phone, A.money FROM Customer C,Account A,CusInfo CI WHERE A.accountNum = CI.accountNum AND C.id = A.id

트리거 생성 코드

CREATE TRIGGER superior_customer ON Account FOR UPDATE AS DECLARE @id int SELECT @id = id FROM Account WHERE money >= 10000 begin UPDATE Customer SET grade = 's' WHERE id=@id end

ESQL-C 코드

#include #include #include #include #include #define MAX 100 #define NO_SQL_ERROR (SQLCODE == 0) #define NO_MORE_TUPLES (SQLCODE == 100) char password1[5]="1234"; static int rem=0; int menu(); void make_acc(); void deposit(); void payment(); void transfer(); void balance(); void viewInfo(); //메뉴출력함수 //계정생성함수 //예금 함수 //출금 함수 //타인의 계좌에 송금함수 //잔액 확인 //고객정보 보기

ESQL-C 코드

void main() { int j,i; char pass[4]; int cnt=0; EXEC SQL BEGIN DECLARE SECTION; char dbname[6]="BANK3", user[3]="sa"; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO :dbname USER :user; for(j=0;j<3;j++) { printf("관리자 확인, 패스워드 입력 : "); for(i=0;i<4;i++) { pass[i]=getch(); printf("*"); } printf("\n"); if(strncmp(password1,pass,4)==0) break; cnt+=1; if(cnt==3) exit(1); } if(NO_SQL_ERROR) printf("은행 데이터베이스가 연결 되었습니다.\n",dbname); else { printf("에러가 발생했습니다(에러코드 : %ld)\n",SQLCODE); exit(1); }

ESQL-C 코드

while(1) { int i=menu(); switch(i) { case 1: make_acc(); break; case 2: deposit(); break; case 3: payment(); break; case 4: balance(); break; case 5: transfer(); break; case 6: viewInfo(); break; case 7: exit(0); } } EXEC SQL DISCONNECT CURRENT; }

ESQL-C 코드

int menu() { int a; printf("\n-은행 고객관리 데이터베이스-"); printf("\n아래의 작업을 선택하시오.\n"); printf("\n①. 계정생성(Make Account)\n"); printf("②. 예금하기(Make Deposit)\n"); printf("③. 출금하기(Make Withdrawal)\n"); printf("④. 잔액확인(Check Balance)\n"); printf("⑤. 송금하기(Send Money)\n"); printf("⑥. 정보보기(View All Members)\n"); printf("⑦. 종료하기(Exit)\n\n"); printf("선택(1-7) : "); scanf("%d",&a); fflush(stdin); return a; }

ESQL-C 코드

oid make_acc() { char ch; int i; FILE *Cnt; EXEC SQL BEGIN DECLARE SECTION; char name[10], jumin[14], address[30], phone[11], accountNum[13]; int money=0; int id=0; EXEC SQL END DECLARE SECTION; for(i=rem;i

}

ESQL-C 코드

printf("[%d]번째 고객의 주민 등록 번호를 입력 : ",i+1); gets(jumin); printf("[%d]번째 고객의 주소를 입력 : ",i+1); gets(address); printf("[%d]번째 고객의 전화 번호를 입력 : ",i+1); gets(phone); printf("[%d]번째 고객의 계좌번호를 입력 : ",i+1); gets(accountNum); printf("[%d]번째 고객의 처음 입금할 금액을 입력(단위:\\) : ",i+1); scanf("%d",&money); fflush(stdin); rem++; printf("위 사실과 동일 합니까?(y/n) : "); scanf("%c",&ch); fflush(stdin); if(ch =='n' || ch == 'N') { rem--; break; }

ESQL-C 코드

EXEC SQL INSERT INTO Customer(id,name) VALUES(:id,:name); if(!NO_SQL_ERROR) { printf("고객 테이블 입력시 에러가 발생했습니다.\n"); exit(1); } EXEC SQL INSERT INTO Account(id,accountNum,money) VALUES(:id,:accountNum,:money); if(!NO_SQL_ERROR) { printf("계좌 테이블 입력시 에러가 발생했습니다.\n"); exit(1); } EXEC SQL INSERT INTO CusInfo(id,accountNum,jumin,address,phone) VALUES(:id,:accountNum,:jumin,:address,:phone); if(!NO_SQL_ERROR) { printf("고객 정보 테이블 입력시 에러가 발생했습니다.\n"); exit(1); } printf("\n"); Cnt=fopen("Cnt","w"); fwrite(&rem,sizeof(int),1,Cnt); fclose(Cnt); //정보를 입력받은 다음부터 저장 가능하도록 //count변수를 파일로 저장한다.

} }

ESQL-C 코드

void deposit() { int i; for(i=0;i<1;i++) { EXEC SQL BEGIN DECLARE SECTION; char search_acc[13]; char name[10],jumin[14]; int money,input_money; EXEC SQL END DECLARE SECTION; struct tm *ptr; time_t lt=time(NULL); ptr=localtime(<); printf("\n계좌 번호 입력 : "); gets(search_acc); EXEC SQL SELECT C.name, CI.jumin, A.money

INTO :name, :jumin, :money FROM Customer C,Account A,CusInfo CI WHERE CI.accountNum = :search_acc AND A.accountNum = :search_acc AND C.id=CI.id; if(NO_MORE_TUPLES) { printf("**없는 계좌번호입니다**\n"); break; }

ESQL-C 코드

printf("\n"); printf("┌──────────────────┐\n"); printf("│성명 : %-29s│\n",name); printf("│주민등록번호 : %-21s│\n",jumin); printf("│현재시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-15ld│\n",money); printf("└──────────────────┘\n"); printf("\n입금할 금액 : "); scanf("%d",&input_money); money+=input_money; EXEC SQL UPDATE Account SET money = :money WHERE accountNum = :search_acc; printf("\n**입금 성공**\n"); printf("┌──────────────────┐\n"); printf("│현재시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-15ld│\n",money); printf("└──────────────────┘\n"); } }

ESQL-C 코드

void payment() { int i; for(i=0;i<1;i++) { EXEC SQL BEGIN DECLARE SECTION; char search_acc[13]; char name[10],jumin[14]; int money,input_money; EXEC SQL END DECLARE SECTION; struct tm *ptr; time_t lt=time(NULL); ptr=localtime(<); printf("\n계좌 번호 입력 : "); gets(search_acc); fflush(stdin); EXEC SQL SELECT C.name, CI.jumin, A.money

INTO :name, :jumin, :money FROM Customer C,Account A,CusInfo CI WHERE CI.accountNum = :search_acc AND A.accountNum = :search_acc AND C.id=CI.id; if(NO_MORE_TUPLES) { printf("**없는 계좌번호입니다**\n"); break; }

ESQL-C 코드

printf("\n"); printf("\n"); printf("┌──────────────────┐\n"); printf("│성명 : %-29s│\n",name); printf("│주민등록번호 : %-21s│\n",jumin); printf("│현재시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-15ld│\n",money); printf("└──────────────────┘\n"); printf("\n출금할 금액 : "); scanf("%ld",&input_money); if(money>input_money) { money-=input_money; EXEC SQL UPDATE Account SET money = :money WHERE accountNum = :search_acc; EXEC SQL COMMIT TRAN; printf("\n**출금 성공**\n"); printf("┌──────────────────┐\n"); printf("│현재시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-15ld│\n",money); printf("└──────────────────┘\n"); } else { printf("\n**잔액 부족. 출금 실패**\n"); EXEC SQL ROLLBACK TRAN; }

ESQL-C 코드

void transfer() { int i; for(i=0;i<1;i++) { EXEC SQL BEGIN DECLARE SECTION; char search_acc[13],self_acc[13]; char name[10],myname[10],jumin[14],myjumin[14]; int money,mymoney,input_money; EXEC SQL END DECLARE SECTION; struct tm *ptr; time_t lt=time(NULL); ptr=localtime(<); printf("이체받을 계좌번호 입력 : "); gets(search_acc); EXEC SQL SELECT C.name, CI.jumin, A.money

INTO :name, :jumin, :money FROM Customer C,Account A,CusInfo CI WHERE CI.accountNum = :search_acc AND A.accountNum = :search_acc AND C.id=CI.id; if(NO_MORE_TUPLES) { printf("**없는 계좌번호입니다**\n"); break; }

ESQL-C 코드

printf("┌────────────────────┐\n"); printf("│이체받을 고객의 성명 : %-17s│\n",name); printf("│주민등록번호 : %-25s│\n",jumin); printf("│현재 시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-19ld│\n",money); printf("└────────────────────┘"); printf("\n이체할 고객의 계좌번호를 입력 : "); gets(self_acc); EXEC SQL SELECT C.name, CI.jumin, A.money

INTO :myname, :myjumin, :mymoney FROM Customer C,Account A,CusInfo CI WHERE CI.accountNum = :self_acc AND A.accountNum = :self_acc AND C.id=CI.id; if(NO_MORE_TUPLES) { printf("**없는 계좌번호입니다**\n"); break; }

ESQL-C 코드

printf("┌────────────────────┐\n"); printf("│이체할 고객의 성명 : %-18s │\n",myname); printf("│주민등록번호 : %-25s│\n",myjumin); printf("│현재 시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-19ld│\n",mymoney); printf("└────────────────────┘"); printf("\n이체할 금액 입력(\\) : "); scanf("%d",&input_money); if(mymoney>input_money) { mymoney-=input_money; money+=input_money; EXEC SQL COMMIT TRAN; EXEC SQL UPDATE Account SET money=:mymoney WHERE accountNum=:self_acc; EXEC SQL UPDATE Account SET money=:money WHERE accountNum=:search_acc; printf("\n**계좌이체 성공**\n"); printf("┌─────────────────────┐\n"); printf("│%-8s 님의 현재 잔액 : (\\) %-11ld│\n",myname,mymoney); printf("│%-8s 님의 현재 잔액 : (\\) %-11ld│\n",name,money); printf("└─────────────────────┘\n"); } else { printf("**잔액 부족, 계좌이체 실패.**\n"); EXEC SQL ROLLBACK TRAN; } } }

ESQL-C 코드

void balance() { int i; for(i=0;i<1;i++) { EXEC SQL BEGIN DECLARE SECTION; char search_acc[13]; char name[10],jumin[14]; int money=0; EXEC SQL END DECLARE SECTION; struct tm *ptr; time_t lt=time(NULL); ptr=localtime(<); printf("\n잔액 확인 계좌번호 입력 : "); gets(search_acc); EXEC SQL SELECT C.name, CI.jumin, A.money

INTO :name, :jumin, :money FROM Customer C,Account A,CusInfo CI WHERE CI.accountNum = :search_acc AND A.accountNum = :search_acc AND C.id=CI.id;

ESQL-C 코드

if(NO_MORE_TUPLES) { printf("**없는 계좌번호입니다**\n"); break; } } printf("\n"); printf("┌──────────────────┐\n"); printf("│성명 : %-29s│\n",name); printf("│주민등록번호 : %-21s│\n",jumin); printf("│현재시각 : %s",asctime(ptr)); printf("│현재 남은 잔액 : (\\) %-15ld│\n",money); printf("└──────────────────┘\n"); }

ESQL-C 코드

void viewInfo() { EXEC SQL BEGIN DECLARE SECTION; char name[10],jumin[14],address[20],phone[11],accountNum[13]; int money,id; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE viewInfo CURSOR FOR SELECT C.id, A.accountNum, C.name, CI.jumin, CI.address, CI.phone, A.money FROM Customer C,Account A,CusInfo CI WHERE A.accountNum = CI.accountNum AND C.id = A.id

ORDER BY C.name,C.id; EXEC SQL OPEN viewInfo;

ESQL-C 코드

printf("==================================고객 정보 ====================================\n"); printf("ID 이름 액(\\)\n"); 계좌번호 주민등록번호 주소 전화번호 잔 printf("================================================== =============================\n"); while(1) { EXEC SQL FETCH viewInfo INTO :id, :name, :accountNum, :jumin, :address, :phone, :money; } if(NO_MORE_TUPLES) { break; } printf("%2d %8s %-s %s %s %s %d\n",id, name, accountNum, jumin, address, phone, money); } EXEC SQL CLOSE viewInfo;