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 형이 효율적임
'Pro*C' 카테고리의 다른 글
[Pro*C 오라클 DB] 프로그램 오류 처리, 데이터 처리 (0) | 2025.01.16 |
---|---|
[Pro*C 오라클 DB] 호스트 변수 (배열, 구조체)를 이용한 프로그램 (0) | 2025.01.16 |
[Pro*C 오라클 DB] Pro*C 컴파일 (0) | 2025.01.09 |
[Pro*C 오라클 DB] Pro*C 프로그램 구성과 DB접속 (0) | 2025.01.08 |
[Pro*C 오라클 DB] Pro*C 오류,에러 진단과 처리 (0) | 2025.01.06 |