450 likes | 732 Views
은행 고객 관리 DB. -3 조 - 32011771 이영철 32011405 강민재. 은행 고객 관리 DB. 테이블구조 -Customer table 고객 ID( 기본키 ), 고객이름 , 고객등급 ( 트리거 ). 은행 고객 관리 DB. Account table 고객 ID( 외래키 ), 고개계좌 ( 기본키 ), 현재금액. 은행 고객 관리 DB. CusInfo table 고객 ID( 외래키 ), 고객계좌 ( 외래키 ), 주민등록번호 , 주소 , 전화. PROGRAM STRUCTURE.
E N D
은행 고객 관리 DB -3조- 32011771 이영철 32011405 강민재
은행 고객 관리 DB • 테이블구조 • -Customer table • 고객ID(기본키), 고객이름, 고객등급(트리거)
은행 고객 관리 DB • Account table • 고객ID(외래키),고개계좌(기본키),현재금액
은행 고객 관리 DB • CusInfo table • 고객ID(외래키),고객계좌(외래키), • 주민등록번호,주소,전화
실행화면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; • } • printf("%2d %8s %-s %s %s %s %d\n",id, name, accountNum, jumin, address, phone, money); • } • EXEC SQL CLOSE viewInfo;
실행화면6 • 고객정보보기(CURSOR)
트랜잭션(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 <stdio.h> • #include <string.h> • #include <stdlib.h> • #include <conio.h> • #include <time.h> • #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<MAX;i++) { • id = rem+1; • printf("[%d]번째 고객의 실명을 입력(입력취소시 ENTER입력) : ",i+1); • gets(name); • if(strlen(name)==0) { • printf("데이터 입력을 취소함.\n"); • break; //이름에다 공백을 입력하면 빠져나감. • }
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); //count변수를 파일로 저장한다. • fclose(Cnt); • } • }
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; • }