Download presentation
Presentation is loading. Please wait.
Published byCharity Black Modified over 8 years ago
1
은행 고객 관리 DB -3 조 - 32011771 이영철 32011405 강민재
2
은행 고객 관리 DB 테이블구조 -Customer table 고객 ID( 기본키 ), 고객이름, 고객등급 ( 트리거 )
3
은행 고객 관리 DB Account table 고객 ID( 외래키 ), 고개계좌 ( 기본키 ), 현재금액
4
CusInfo table 고객 ID( 외래키 ), 고객계좌 ( 외래키 ), 주민등록번호, 주소, 전화 은행 고객 관리 DB
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 #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(<); 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(<); 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("│ 성명 : %-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(<); 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(<); 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; }
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.