본문 바로가기
IT/PROGRAM

Pro*C . 오라클 DB 데이터를 C / C++ 프로그램으로 제어

by SidePower 2022. 9. 25.

오라클은 C/C++ 프로그램 안에서 쿼리문을 직접 실행해서

테이블 데이터를 조작할 수 있게 PreCompiler를 제공하고 있습니다.

 

C 소스 프로그램 안에 SQL 쿼리문을 삽입했다고

embedded SQL programming 이라고도 합니다.

보통 Pro*C라고 얘기하는데요.

 

Pro*C의 소스 파일 확장자는 pc입니다.

source.pc를 오라클에서 제공하는 PreCompiler를 이용합니다.

 

 C 프로그램 실행 과장을 보면

C 소스 코딩 source.c

 gcc 컴파일  오브젝트 파일 생성 source.o

 링크  실행파일 생성 source  실행

 

 PC 프로그램 실행 과정

PC 소스 코딩 source.pc  PreCompiler  source.c 생성

 gcc 컴파일  오브젝트 파일 생성 source.o

 링크  실행파일 생성 source  실행

 

PC 과정을 보면 C 과정 앞에 PreCompiler만 추가된 걸 볼 수 있을 거예요.

 

PreCompiler의 역할이

pc 소스 코드를 c 프로그램 코드로 변환해 주는 역할입니다.

 

pc 소스 코딩은

c 프로그램 소스 코드와 동일하게 작성하고

오라클 연동과 쿼리 조작 부분만 Pro*C 작성법에 맞게 기술하시면 됩니다.

 

Pro*C 작성법에 대해 간단히 알아볼게요.

 

Pro*C 소스 작성 시 SQL 문장을 사용하기 위해서는

반드시 EXEC SQL이라는 키워드를 문장 앞에 입력해야 됩니다.

EXEC SQL 뒤에 상황에 맞는 SQL 관련 문장을 넣어주시면 됩니다.

 

 호스트 변수 

오라클 연동과 SQL 쿼리문에 삽입되는 변수로

DB 데이터 값들을 주고받을 수 있습니다.

 

호스트 변수 사용은 변수명 앞에 : (콜론)과 함께 사용됩니다.

 

호스트 변수는 C언어의 기본 자료형을 모두 사용할 수 있습니다.

배열(Array)과 구조체(Struct)도 물론 사용할수 있으며

오라클의 VARCHAR도 가변 길이의 문자열로 쓸 수 있습니다.

 

 가변 길이 . VARCHAR

오라클의 VARCHAR 자료형을 그대로 Pro*C에서 사용할 수 있게 했네요.

여기서 가변 길이라는 의미는 길이가 딱 정해진 게 아니고

늘었다 줄었다 할 수 있다는 건데요.

지정된 길이가 최대 길이로 결정되고 최대 길이보다 크면 안 되지만

작아도 된다는 얘기입니다.

 

오라클의 VARCHAR 가변 길이를 표현하기 위해 

arr과 len이 포함된 구조체(sturct)로 자동으로 확장됩니다.

예를 들어 아래와 같이 VARCHAR를 선언했다면
20byte가 최대 길이입니다.
VARCHAR data1[20];

data1 변수에 접근은 data1 이라는 구조체(struct)의
len 필드와 arr 필드를 사용해야 됩니다.
struct {
	unsigned short len;
	unsigned char arr[20];
} data1;

len : 데이터 byte 길이 필드
arr : 데이터 필드

* 사용예..
printf("data1 -> [%s]\n",data1.arr);
data1.len = strlen(data1.arr);

 

 

 호스트 변수 선언부

EXEC SQL BEGIN DECLARE SECTION;
	int row_count;
	char user[20];
	char passwd[10];
	VARCHAR data1[20];
	.
	.
	변수들....
EXEC SQL END DECLARE SECTION;

EXEC SQL 키워드 뒤에 

BEGIN DECLARE SECTION 과 END DECLARE SECTION 로 호스트 변수를 선언합니다.

선언문 사이에 필요한 변수들을 다 넣어주시면 됩니다.

 

■ SELECT 문

EXEC SQL SELECT val1,val2 INTO :h_val1,:h_val2
FROM T_DAT
WHERE va1l = :h_parm1;

 

 INSERT , UPDATE , DELETE 문

EXEC SQL INSERT INTO T_DAT (val1,val2)
VALUES(:h_val1,:h_val2);


EXEC SQL UPDATE T_DAT
	SET val2 = :h_val2
    WHERE val1 = :h_val1;
    

EXEC SQL DELETE FROM T_DAT
	WHERE val1 = :h_val1;

 

 CURSOR와 FETCH

SELECT 쿼리문을 통해 테이블에서 데이터를 조회할 때

1건만 조회하는 경우가 있고

1건이 아닌 여러 건을 조회하는 경우가 있겠죠.

 

CURSOR는 여러건을 조회하는 경우에 시스템의 공유 저장공간을 활용해서

조회된 여러건을 가지고 있다가

FETCH를 통해 CURSOR에 담긴 여러건을 순차적으로 한건씩 꺼내

사용할 수 있습니다.

 

 CURSOR 선언

커서 이름을 정하고 SELECT 쿼리문과 연결합니다.

EXEC SQL DECLARE cursor_name CURSOR FOR
SELECT val1 , val2
FROM T_DAT
WHERE val1 = :h_val1;

 

 CURSOR OPEN

SELECT 쿼리문을 실행하고 결과 데이터를 공유 저장공간에 배치합니다.

EXEC SQL OPEN cursor_name;

 

 FETCH

CURSOR 결과 데이터를 줄(행) 단위로 가져옵니다.

EXEC SQL FETCH cursor_name 
INTO :h_val1 , :h_val2;

 

 CLOSE

FETCH가 정상적으로 끝나고 이제 자원을 해제합니다.

EXEC SQL CLOSE cursor_name;

 

 지시 변수 . indicator variable

오라클에서 테이블 칼럼에 NULL을 입력하거나 출력할 때

SQL 쿼리문에서는 NULL을 쉽게 대입해서 사용할 수 있지만

C언어의 변수로는 한 번에 표현할 수 없습니다.

Pro*C 쿼리문에 NULL 값을 설정할 수 있게 지시 변수를 선언할 수 있습니다.

 

지시 변수는 short 자료형으로 선언해야 되며

사용법은 호스트 변수 뒤에 :(콜론)과 함께 붙여 쓰면 됩니다.

short indicator변수;

:host변수:indicator변수 또는 :host변수 INDICATOR :indicator변수

 

지시 변수는 호스트 변수에 NULL 할당과 함께 

호스트 변수 값이 잘못되어 길이가 잘렸는지도 확인할 수 있습니다.

EXEC SQL BEGIN DECLARE SECTION;
	int h_val_1;
	int h_val_2;
	short indicator_1; //지시 변수
EXEC SQL END DECLARE SECTION;

EXEC SQL 
SELECT val_1,val_2 
INTO :h_val_1, :h_val_2:indicator_1
FROM T_TABLE;

★val_2 값을 받는 h_val_2 호스트변수에 지시변수 indicator_1를 대입했습니다.

 

 지시 변수 값

0 정상 처리
-1 NULL 
-2 호스트 변수가 잘려져 저장됨
> 0 호스트 변수가 잘려져 저장됨 . 잘리기 전의 원래 값 길이
if (indicator변수 == -1){
	printf("val_2가 NULL이므로 val_1 : %d \n", h_val_1);
}
else {
	printf("val_2가 NULL 아니므로 val_1과 val_2 : %d %d \n", h_val_1,h_val_2);
}

 

이번에는 Pro*C 프로그래밍 전에 알고 있어야 되는

기본만 알아봤어요.

반응형

댓글