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