본문 바로가기

Pro*C

[Pro*C 오라클 DB] Pro*C 시작

 

 


Pro*C 개요

  • PL/SQL은 오라클 내부라는 한정된 공간에서 실행되는 프로그램
  • 내부라는 한정된 제약을 해결하기 위해 외부 C 프로그램과 결합할 수 있는 선행 컴파일러 제공
    -> 오라클에서 Pro*C 라고한다

  • 오라클 내부가 아닌 외부 프로그램으로 작성되어 작업을 수행
    -> Pro*C 만으론 컴파일을 할 수 없다.
    -> 선행 컴파일
  • Pro*C 는 실행파일이 아닌 C 컴파일러가 인식 할 수 있는 출력 파일(~~~.c) 파일을생성한다.
  • C프로그램의 통상적인 방법으로 컴파일 되고, 오라클 라이브러리와 결합되어 실행모듈을 만든다.

 

확장 범위

  • 큰 틀에서 보면 C 프로그램안에 SQL 코드가 들어가 있는 것이 Pro*C 프로그램이다.
  • C로 구현할 수 있는 모든 기능은 Pro*C 로도 구현 가능하다.

 

프로그램 작성방식

 

컴파일 옵션의 변경을 통해 작성 방식을 선택하여 사용할 수 있다.

1. 내장 SQL 방식

  • C프로그램 내부에서 EXEC SQL 이라는 접두사 뒤에 SQL 문장을 기술하는 방식
  • DML,DDL,DCL PL/SQL 일반 SQL 문장을 내장 SQL문에 사용가능하다.

 

2. OCI(Oracle Call Interface) 방식

  • OCI 라이브러리를 통해서 오라클 SQL문장을 직접 호출하여 사용하는 방식
  • 내장 SQL 보다 하위레벨에 있음
  • OCI로 DB 핸들링을 하기 때문에 DB서버의 자원을 효율적으로 관리할 수 있음
  • SQL 문장 수행의 각 단계를 직접 제어할 수 있는 장점이 있음

OCI는 복잡하고 숙련도가 요구되는 단점이 있기 때문에

대중적인 내장 SQL 프로그램에 대한 얘기를 할 것임.

 

두 방식의 차이 표

내장 SQL OCI 방식
SQL 연산을 쉽고 명료하게 처리하기 위해 3GL 어플리케이션 개발 DB 최대한 제어, 3GL 어플리케이션 개발
간결한 코드 길고 복잡한 코드
컴파일 전에 소스 코드 선행 컴파일 선행 없이 코드 컴파일
선행 컴파일러를 별도로 구매 오라클 DB 와 함께 OCI 라이브러리 획득
ANSI 표준 준수 독점 비 표준 절차적 호출 인터페이스 사용
다중 행 질의만을 위해 명시적 커서 선언 모든 DBㅇ녀산을 처리하기 위한 명시적 커서 선언
선행 컴파일 시에 SQL 구문 확인 실행 시간에 SQL 구문 확인

 

 

데이터 형

  • C 프로그램 에서 사용하는 일반적인 데이터 형
  • Pro*C 에서만 사용할 수 있는 고유의 데이터형
    • 기본적인 데이터 형의 일차원 배열
    • CHAR, VARCHAR 형의 이차원 배열
    • VARCHAR 변수는 오라클에서 구조체 멤버 길이를 설정하지만, 배열을 NULL-terminate(\0) 하지 않음
      -> 출력 전 NULL-terminate 설정 CHAR는 자동으로 되어있음
    • 기본적 데이터 형에 대한 포인터
    • typedef
    • 구조체
    • 배열의 구조체
    • 구조체 포인터
    • 구조체 배열
  • 오라클 DB의 데이터 형과 C 프로그램의 데이터 형은 호환된다.

    [표] 오라클 데이터형과 C 데이터형의 호환성

    오라클 DB 데이터형 C의 데이터형 설명
    CHAR(n) char[n] 고정 길이의 문자열 데이터. CHAR는 고정 크기만큼 문자를 저장.
    VARCHAR2(n) char[] 또는 char* 가변 길이 문자열 데이터. 문자열을 배열이나 포인터로 저장.
    NUMBER int, long, float, double 숫자 데이터. 정수와 부동 소수점 숫자에 따라 적절한 C 타입을 사용.
    DATE struct tm 또는 time_t 날짜 및 시간 데이터를 저장. struct tm은 날짜와 시간을 세분화하여 저장. time_t는 시간을 초 단위로 저장.
    TIMESTAMP struct tm 또는 time_t 날짜와 시간을 보다 세밀하게 저장하는 데이터형. C에서도 struct tm으로 처리 가능.
    BLOB void* 또는 unsigned char* 이진 데이터 저장. C에서는 포인터로 다루며, 크기가 고정되지 않은 데이터를 처리.
    CLOB char* 문자 데이터의 대용량 저장. C에서는 동적 문자열을 사용하여 처리.
    RAW unsigned char* 바이너리 데이터를 저장. C에서는 바이트 배열로 처리.
    LONG char* 또는 void* 매우 큰 문자열 데이터를 처리. C에서 동적 메모리 할당을 통해 처리.
    BINARY_FLOAT float 32비트 부동 소수점 숫자. C의 float 타입과 호환.
    BINARY_DOUBLE double 64비트 부동 소수점 숫자. C의 double 타입과 호환.

VARCHAR는 C프로그램의 char 와는 다르기 때문에 Pro*C 프로그램에서 다음 구조체 형태로 생성됨

struct {
    unsigned short int len;
    unsigned char arr[20];
} uid;


Pro*C의 VARCHAR형은 오라클의 VARCHAR2와 같이 가변길이로 할당되어 메모리 효율적 관리가 가능


----------------------------------------------------------------------
char 형의 선언과 할당

char uid[20];
strcpy(uid, "userid");

----------------------------------------------------------------------
VARCHAR 형의 선언과 할당

VARCHAR uid[20];
strcpy((char*)uid.arr, "userid");
uid.len = (short) strlen((char*)uid.arr);
----------------------------------------------------------------------

VARCHAR 형은 선언과 동시에 len과 arr 라는 멤버를 갖는 구조체로 선언된다.

 

 

  • VARCHAR 형도 구조체이기 때문에 데이터를 할당하기 위해 각 멤버에도 데이터를 할당해야함
  • 데이터 전달이 포인터로만 가능하기 때문에 데이터 형에 대한 포인터로의 형 변환이 필요

 

저장공간의 차이

 

char

- 데이터 형의 길이만큼 저장 공간을 차지

 

VARCHAR

- 데이터 길이와 상관없이 할당받은 데이터 길이만큼의 저장 공간을 가짐

- 메모리 효율 측면으로 보면 VARCAHR 형이 효율적임