CS/DataBase

Pro*C

prden 2023. 1. 8. 18:20

1. Pro*C란 ?

 대부분의 DBMS는 외부 C 프로그램에서 DB관련 로직을 짤 수 있게 선행 컴파일러를 제공한다. Pro*C란 오라클에서 제공해주는 선행 컴파일러이다. 오라클은 PL/SQL이라는 절차형 언어를 제공한다. 하지만 PL/SQL은 오라클 내부에서 실행되는 프로그램이다. Pro*C는 선행 컴파일러이기 때문에 이 자체만으로 실행파일을 만들어낼 수 없다. Pro*C파일(.pc)파일은 컴파일되어 C프로그램 파일(.c)을 만들어낸다. 그 이후로는 C 프로그램과 똑같다. 

 

2. Pro*C 컴파일 하는 법

소스파일은 SQL문을 포함하며 확장자 .PC를 갖는다. 이 경우 컴파일을 두 번 해주어야 한다. 

Pro*C 컴파일로 C 파일을 생성하고, C파일을 다시 컴파일해서 실행파일을 만들어 줘야 한다.(.c -> .o -> .exe)

 

1) proc 명령어로 컴파일

ex hello.pc 파일을 컴파일 할 경우

proc hello.pc

 이 결과로 hello.c 파일이 생성되게 된다.

인풋파일명, 아웃풋파일명 지정하고 싶을 때는

proc iname=hello.pc oname=hello.c.20230109

iname(in), oname(out)옵션 추가

 

2) proc로 컴파일한 결과물로 실행파일을 만들경우

리눅스, 유닉스에서

cc -|${ORACLE_HOME}/precomp/public -L${ORACLE_HOME}/lib -lclntsh hello.c -o hello

{ORACLE_HOME}/precomp/public에는 sql처리 관련된 헤더파일 저장되어있음 이 헤더파일을 컴파일이 찾아 링크할 수 있도록 -|{ORACLE_HOME}/precomp/public 옵션 넣음.

윈도우에서는 gcc~

 

3) 컴파일을 위한 makefile 제작

 

 

https://sidepower.tistory.com/513

 

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

오라클은 C/C++ 프로그램 안에서 쿼리문을 직접 실행해서 테이블 데이터를 조작할 수 있게 PreCompiler를 제공하고 있습니다. C 소스 프로그램 안에 SQL 쿼리문을 삽입했다고 embedded SQL programming 이라

sidepower.tistory.com

https://jhnyang.tistory.com/532

 

[proc/c++] gcc/cc로 pc파일 컴파일 하기 (makefile 없이 샘플 소스 기초 컴파일방법)

[DBMS/ SQL/ PROC 포스팅 정리 링크] 안녕하세요~~ 두 번째로 가져온 proc 포스팅입니다. 오늘은 proc를 컴파일 하는 방법에 대해 알아볼건데요. 이번 포스팅은 cc, gcc로 컴파일 하는 법을 알아보고, 다음

jhnyang.tistory.com

 

3. Pro*C 사용법

1) 모든 SQL문에 EXEC SQL이라는 접두사를 붙인다.

2) Pro*C프로그램에 포함되어 있는 SQL문은 실행문 혹은 선언문중의 하나로 분류할 수 있다.

3) 실행문 : DML, DDL, DCL 등 SQL 실행문을 실행한 후 SQLCA(SQL 통신영역)에는 일련의 리턴코드가 저장된다. 

4) 논리적 작업단위는 최초의 SQL 실행문을 실행하면서 시작된다. 따라서 CONNECT, COMMIT, ROLLBACK WORK 문의 다음에 첫 번재로 나타나는 SQL 실행문부터 논리적인 작업단위가 새롭게 시작된다. 

 

선언절

/*  선언절로 호스트변수 또는 표지변수를 선언  */
EXEC SQL BEGIN DECLARE SECTION;


EXEC SQL END DECLARE SECTION;

/*  예시  */

EXEC SQL BEGIN DECLARE SECTION;
int pempno; /* 사번 */

char pname[11]; /* 성명 */

int pdeptno; /* 부서 */
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT deptno, ename
INTO :pdeptno, :pname
FROM emp
WHERE empno = :pempno;

 1) SQL문 앞에서는 앞에 콜론(:)을 붙인다.

 2) C 문에서는 앞에 콜론을 붙이지 않는다.

 3) 포인터 변수는 C에서 통상적으로 행하는 방법으로 선언함으로써, 선언절 내에서 사용할 수 있다.

EXEC SQL BEGIN DECLARE SECTION;
int I, j, *intptr;
char *cp;
EXEC SQL END DECLARE SECTION;

https://sunder4.tistory.com/46

 

[PRO*C] 거의 모든 예제가 다 있다.

만들어 주신분에게 감사를 드립니다.^^; 이글은 초보자를 위한 것으로 Pro*C란 무엇인가를 설명해 놓은 것일 뿐입니다. 그냥 참조만 하시기 바랍니다. 원본 출처 : http://home.bcline.com/hoya1/ 1.1 Pro*C란?

sunder4.tistory.com

3-1 Pro*C Cursor

EXEC SQL DECLARE hello_cursor FOR
	SELECT * FROM TEST;
    
EXEC SQL OPEN hello_cursor;
while(1) {
	EXEC SQL FETCH hello_cursor INTO : test_var...
    
    
    }
EXEC SQL CLOSE hello_cursor;

https://goddaehee.tistory.com/117

 

[Oracle] PL/SQL 기초3 - 커서

[Oracle] PL/SQL 기초3 - 커서 (CURSOR) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ PL / SQL 커서 ] 입니다. : ) 개인적으론 PL / SQL 의 꽃은 "커서"가 아닐까 생각합니다. 커서 (CURSOR) [정의] - SQL 커서는 Oracl

goddaehee.tistory.com

4. 예제들

#1. 예제

/* ORACLE의 로그온과 로그오프 */
#include 
/***************************************************************
This is sample Pro*C program which will log onto a database asscott/tiger.
***************************************************************/
EXEC SQL BEGIN DECLARE SECTION;    
VARCHAR uid[20];    
VARCHAR pwd[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
void main(void){    
/* log into ORACLE */    
strcpy(uid.arr, "SCOTT");
                       
/* copy the user name */    
uid.len = strlen(uid.arr);    
strcpy(pwd.arr, "TIGER");                       
/* copy the password */    
pwd.len = strlen(pwd.arr);    
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;    
printf("Connected to ORACLE user : %s\n", uid.arr);    
EXEC SQL COMMIT WORK RELEASE;            /* log off database */    
exit(0);
}

'CS > DataBase' 카테고리의 다른 글

ORACLE 쿼리 조인, 쿼리 튜닝  (0) 2023.03.10
Lock, DeadLock, Blocking  (0) 2023.03.10
ORACLE 실행계획, Hint, SQL 튜닝  (0) 2022.12.31
ORACLE 식별자  (0) 2022.12.31
DB ConnectionPool  (0) 2022.12.30