본문 바로가기

C-Language/Pro C, CRUD 2

Pro C, CRUD 2

Pro C에서 소스파일(*.pc) 파일을 다수개로 분리하여 작성하는 예
Pro C, Oracle 11g, Visual Studio 2008 Express Edition

분리된 각각의 pc 파일은 모두 다음과 같은 설정을 해주어야 한다.

솔루션 탐색기 상의 각 pc 파일 위에서 마우스 우측 > 속성 > 사용자 지정 빌드단계 >
명령줄: proc.exe $(ProjectDir)$(InputName).pc
출력: $(ProjectDir)$(InputName).c

그리고 각 pc 파일 위에서 마우스 우측을 눌러 각 pc 파일을 컴파일한다.
모든 pc 파일을 컴파일한 후에 빌드 > 솔루션 빌드 
디버그 > 디버그하지 않고 시작

ProcTest.pc

#include <stdio.h>
#include "sqlca.h"

int select (int empno);
int insert (int empno, char *ename, int sal);
int update (int empno, int sal);
int delete (int empno);

int main(void) {
 
 int empno;
 char ename[20];
 int sal;
 
 printf("\n검색대상 사원번호를 입력하세요:");
 scanf("%d", &empno);
 select(empno);
 
 puts("\n입력할 사원정보(사번 이름 급여)를 공백으로 구분하여 입력하세요");
 scanf("%d %s %d", &empno, ename, &sal);
 insert(empno, ename, sal);
 
 puts("\n변경할 사원의 사번과 급여액을 공백으로 구분하여 입력하세요");
 scanf("%d %d", &empno, &sal);
 update(empno, sal);
 
 puts("\n삭제할 사원정보의 사번을 입력하세요");
 scanf("%d", &empno);
 delete(empno);
 
 printf("프로그램 종료\n");
 return 0;
}




select.pc

#include <stdio.h>
#include "sqlca.h"

int select(int _empno) {
 EXEC SQL BEGIN DECLARE SECTION;
       char *connstr = "
scott/ojtit@orcl";
       int empno = _empno;
       VARCHAR ename[20];
       int deptno;
 EXEC SQL END DECLARE SECTION;
 
 EXEC SQL CONNECT :connstr;
 
 if(sqlca.sqlcode == 0) {
  printf("오라클 연결 성공\n");
 }else{
  printf("오류 : 오라클 연결 실패\n");
 }
 EXEC SQL WHENEVER NOT FOUND GOTO not_found;
 EXEC SQL WHENEVER SQLERROR GOTO sql_error;
 EXEC SQL
  SELECT   ename, deptno
  INTO       :ename, :deptno
  FROM      employees
  WHERE    empno = :empno;
 
 ename.arr[ename.len] = '\0';
 printf("검색된 사원정보 empno=%d, ename=%s, deptno=%d \n", empno, ename.arr, deptno);

 return 0;
 
 not_found:
 printf("검색된 사원정보가 없습니다\n");
 return 0;
 
 sql_error:
 printf("검색도중 오류가 발생했습니다\n");
 sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
 printf("오류코드=%d, 오류메시지=%s \n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
 return 1;
}




insert.pc

#include <stdio.h>
#include "sqlca.h"

int insert(int _empno, char *_ename, int _sal) {
 EXEC SQL BEGIN DECLARE SECTION;
       char *connstr = "scott/ojtit@orcl";
       int empno = _empno;
       char *ename = _ename;
       int sal = _sal;
 EXEC SQL END DECLARE SECTION;
 
 EXEC SQL CONNECT :connstr;
  
 if(sqlca.sqlcode == 0) {
  printf("오라클 연결 성공\n");
 }else{
  printf("오류 : 오라클 연결 실패\n");
 }
 
 EXEC SQL WHENEVER SQLERROR GOTO sql_error;
 EXEC SQL
  INSERT INTO
        employees (empno, ename, sal)
  VALUES (:empno, :ename, :sal);
  
 printf("성공적으로 사원정보를 저장했습니다\n");
 EXEC SQL COMMIT WORK RELEASE;
 
 return 0;
 
 sql_error:
 printf("레코드 입력도중 오류가 발생했습니다\n");
 sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
 printf("오류코드=%d, 오류메시지=%s \n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
 return 1;

}


update.pc

#include <stdio.h>
#include "sqlca.h"

int update(int _empno, int _sal) {
 EXEC SQL BEGIN DECLARE SECTION;
       char *connstr = "scott/ojtit@orcl";
       int empno = _empno;
       int sal = _sal;
 EXEC SQL END DECLARE SECTION;
 
 EXEC SQL CONNECT :connstr;
  
 if(sqlca.sqlcode == 0) {
  printf("오라클 연결 성공\n");
 }else{
  printf("오류 : 오라클 연결 실패\n");
 }
 
 EXEC SQL WHENEVER SQLERROR GOTO sql_error;
 EXEC SQL
  UPDATE employees
  SET
   sal = :sal
  WHERE
   empno = :empno;
  
 printf("성공적으로 사원정보를 변경했습니다\n");
 EXEC SQL COMMIT WORK RELEASE;
 
 return 0;
 
 sql_error:
 EXEC SQL WHENEVER SQLERROR CONTINUE;
 printf("사원정보 변경도중 오류가 발생했습니다\n");
 sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
 printf("오류코드=%d, 오류메시지=%s \n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
 EXEC SQL ROLLBACK WORK RELEASE;
 return 1;

}


delete.pc

#include <stdio.h>
#include "sqlca.h"

int delete(int _empno) {
 EXEC SQL BEGIN DECLARE SECTION;
       char *connstr = "scott/ojtit@orcl";
       int empno = _empno;
 EXEC SQL END DECLARE SECTION;
 
 EXEC SQL CONNECT :connstr;
  
 if(sqlca.sqlcode == 0) {
  printf("오라클 연결 성공\n");
 }else{
  printf("오류 : 오라클 연결 실패\n");
 }
 
 EXEC SQL WHENEVER SQLERROR GOTO sql_error;
 EXEC SQL
  DELETE FROM
   employees
  WHERE
   empno = :empno;
  
 printf("성공적으로 사원정보를 삭제했습니다\n");
 EXEC SQL COMMIT WORK RELEASE;
 
 return 0;
 
 sql_error:
 EXEC SQL WHENEVER SQLERROR CONTINUE;
 printf("사원정보 삭제도중 오류가 발생했습니다\n");
 sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
 printf("오류코드=%d, 오류메시지=%s \n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
 EXEC SQL ROLLBACK WORK RELEASE;
 return 1;

}