1 / 45

은행 고객 관리 DB

은행 고객 관리 DB. -3 조 - 32011771 이영철 32011405 강민재. 은행 고객 관리 DB. 테이블구조 -Customer table 고객 ID( 기본키 ), 고객이름 , 고객등급 ( 트리거 ). 은행 고객 관리 DB. Account table 고객 ID( 외래키 ), 고개계좌 ( 기본키 ), 현재금액. 은행 고객 관리 DB. CusInfo table 고객 ID( 외래키 ), 고객계좌 ( 외래키 ), 주민등록번호 , 주소 , 전화. PROGRAM STRUCTURE.

yorick
Télécharger la présentation

은행 고객 관리 DB

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 은행 고객 관리 DB -3조- 32011771 이영철 32011405 강민재

  2. 은행 고객 관리 DB • 테이블구조 • -Customer table • 고객ID(기본키), 고객이름, 고객등급(트리거)

  3. 은행 고객 관리 DB • Account table • 고객ID(외래키),고개계좌(기본키),현재금액

  4. 은행 고객 관리 DB • CusInfo table • 고객ID(외래키),고객계좌(외래키), • 주민등록번호,주소,전화

  5. PROGRAM STRUCTURE

  6. 현재 테이블에 입력된 값

  7. 실행화면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); • }

  8. 실행화면2 • 입금화면

  9. 실행화면3 • 출금화면

  10. 실행화면4 • 잔액확인

  11. 실행화면5 • 계좌이체

  12. 실행화면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;

  13. 실행화면6 • 고객정보보기(CURSOR)

  14. 뷰(view) 생성

  15. 트리거(TRIGGER)

  16. 트리거(TRIGGER)-계속

  17. 트랜잭션(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");

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

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

  20. 트랜잭션(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");

  21. 트랜잭션(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; }

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

  23. 테이블 생성 코드 • CREATE TABLE Customer ( • id int NOT NULL, • name char(10), • grade char(2), • UNIQUE (id), • PRIMARY KEY (id) • );

  24. 테이블 생성 코드 • 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 • );

  25. 테이블 생성 코드 • 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) • );

  26. 뷰 생성 코드 • 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

  27. 트리거 생성 코드 • 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

  28. 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(); //고객정보 보기

  29. 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); • }

  30. 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; • }

  31. 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; • }

  32. 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; //이름에다 공백을 입력하면 빠져나감. • }

  33. 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; • }

  34. 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); • } • }

  35. 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(&lt); • 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; • }

  36. 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"); • } • }

  37. 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(&lt); • 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; • }

  38. 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; • } • } • }

  39. 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(&lt); • 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; • }

  40. 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; • }

  41. 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; • } • } • }

  42. 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(&lt); • 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;

  43. 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"); • } • }

  44. 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;

  45. 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; • }

More Related