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, :salFROM employeesWHERE 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결과