Pro*C를 만들어보자.

이번에는 이전에 만들었던 오라클 디비에서 Pro*C 예제를 만들어보도록 하겠습니다.

유튜브 : https://youtu.be/CsXipxgXn98

1. Vs Code에서 sample.pc 파일을 만듭니다.

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

void main() {
   EXEC SQL BEGIN DECLARE SECTION;
      VARCHAR username[20];
      VARCHAR password[20];
   EXEC SQL END DECLARE SECTION;

   strcpy(username.arr, "hr");
   strcpy(password.arr, "password");

   EXEC SQL CONNECT :username IDENTIFIED BY :password;
   printf("Connected to Oracle as %s\n", username.arr);

   EXEC SQL COMMIT WORK RELEASE;
   printf("Disconnected from Oracle.\n");
}


2. 파일을 docker로 이동합니다.

docker cp C:\Users\YourName\Documents\sample.pc oracle-db:/home/oracle/

3. gcc를 설치합니다.

1. root 권한으로 bash에 접속합니다.

  docker exec -it --user root oracle-db bash

2. gcc를 설치합니다.

  yum install gcc


4. proc를 컴파일합니다.

proc iname=sample.pc : docker exec -it oracle-db bash 명령어로 쉘에 접속 후 실행해야합니다.

위 명령을 실행하면 sample.c 파일이 만들어져야 합니다. 만약 안만들어진다면 gcc가 설치가 안되어 있는지 
아니면 include 경로가 맞는지 확인을 해야 합니다.


5. c 파일을 컴파일합니다.

gcc -o sample sample.c -L$ORACLE_HOME/lib -I$ORACLE_HOME/precomp/public -lclntsh -lpthread -ldl -lm
여기까지 되었다면 sample 파일이 생성이 되었을 겁니다. 그러면 ./sample 명령을 통해 프로그램을 실행 할 수 있습니다.
----------------------------------------------------------------------------------------------

두번째 예제

이번에는 샘플 테이블의 employees 테이블에서 조회하는 법을 만들어보겠습니다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

EXEC SQL BEGIN DECLARE SECTION;
   VARCHAR username[20];
   VARCHAR password[20];
   VARCHAR connect_string[200];  
   int empno;
   VARCHAR ename[20];
    int sal;
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE sqlca;

void sql_error();

main()
{
    strcpy(username.arr, "HR");
    username.len = strlen(username.arr);
    strcpy(password.arr, "password");
    password.len = strlen(password.arr);
    strcpy(connect_string.arr, "//localhost:1521/ORCLPDB1");
    connect_string.len = strlen(connect_string.arr);

    EXEC SQL WHENEVER SQLERROR DO sql_error();

    EXEC SQL CONNECT :username IDENTIFIED BY :password USING :connect_string;

    printf("Connected to Oracle as %s\n", username.arr);

    while (1)
    {
        printf("Enter employee number: ");
        scanf("%d", &empno);
        if (empno == 0)
            break;

        EXEC SQL SELECT first_name, salary INTO :ename, :sal
            FROM employees
            WHERE employee_id = :empno;

        ename.arr[ename.len] = '\0';
        printf("Employee %d is %s and earns %d\n", empno, ename.arr, sal);
    }
    exit(0);
}

void sql_error()
{
    EXEC SQL WHENEVER SQLERROR CONTINUE;

    printf("\nORACLE error detected:\n");
    printf("\n%.70s\n", sqlca.sqlerrm.sqlerrmc);

    EXEC SQL ROLLBACK WORK RELEASE;
    exit(1);
}

파일을 docker로 복사하기.
docker cp f:\temp_study\oracle\employees.pc oracle-db:/home/oracle/source
.pc 파일 빌드하기
proc iname=employees.pc    
.c 파일 빌드하기
gcc -o employees employees.c -L$ORACLE_HOME/lib -lclntsh -lpthread -ldl -lm -lclntshcore -lnnz19 -lons 
프로그램 실행하기
./employees
결과

댓글 쓰기

댓글 목록