본문 바로가기
IT/PROGRAM

오라클 Pro*C 데이타베이스 DB 접속과 해제하기

by SidePower 2022. 9. 26.

SQL 쿼리문을 날리기 전에 당연히 DB에 접속을 해야겠죠.ㅋ

 

Pro*C에서의 Oracle 접속과 해제에 대해서 간단히 알아볼게요.

 

접속을 위해선 오라클 계정과 계정의 비밀번호를 알고 있어야 될 거예요.

또 오라클이 설치된 서버가 아닌 다른 서버 장비에 설치된 오라클에 접속하기 위해

TNS을 이용한 원격 접속을 위해 TNSNAME도 알아야 됩니다.

 

TNS정보는 오라클의 설치된 ORACLE_HOME 경로의

$ORACLE_HOME/network/admin 디렉터리 안에

TNSNAMES.ORA 파일 안에 기록되어 있습니다.

오라클을 관리하는 DBA가 잘 설정해 둔 거를 가져와서 사용만 하면 됩니다.

 TNSNAMES.ORA 샘플

REMOTE_DB1 = 
( DESCRIPTION = 
        ( ADDRESS = ( PROTOCAL = TCP ) ( HOST = 111.111.111.111 ) ( PORT = 1521 ))
        ( CONNECT_DATA = ( SERVICE_NAME = ora11 ))
}

REMOTE_DB2 = 
( DESCRIPTION = 
        ( ADDRESS = ( PROTOCAL = TCP ) ( HOST = 222.222.222.222 ) ( PORT = 1521 ))
        ( CONNECT_DATA = ( SERVICE_NAME = ora11 ))
}

 

 ORACLE DB 접속하기

접속 명령어는 CONNECT이며

계정과 비밀번호를 따로 입력하거나 같이 묶어서 입력할 수도 있고

TNSNAME도 물론 같이 사용할 수 있습니다.

 

EXEC SQL BEGIN DECLARE SECTION;
	char * user = "account1";
	char * pass = "passwd1";
	char * tns = "remote_db1";
	char * conn_str1 = "account1/passwd1";
	char * conn_str2 = "account1/passwd1@remote_db1";
EXEC SQL END DECLARE SECTION;

//아래 4가지중에 편하신걸로 사용하시면 됩니다.

♠ 로컬 오라클 접속
EXEC SQL CONNECT :user IDENTIFIED BY :pass;

♠ TNS를 이용한 원격 오라클 접속
EXEC SQL CONNECT :user IDENTIFIED BY :pass USING :tns;

♠ 계정,암호 묶어서 접속
EXEC SQL CONNECT :conn_str1;

♠ 계정,암호,TNS 묶어서 접속
EXEC SQL CONNECT :conn_str2;

if(SQLCODE == 0) {
	printf("DB Connect 정상\n");
}
else{
	printf("DB Connect 오류\n");
	printf("SQLCODE [%d] , 오류 메시지 [%.*s]\n",sqlca.sqlerrm.sqlerrml-1,sqlca.sqlerrm.sqlerrmc);
}

 

 

또 Pro*C 프로그램에서 DB Connection를 여러 개 사용하기 위해

AT 명령어를 이용해 Connection을 지정할 수도 있습니다.

보통 DB 접속은 한번만 하면 되지만 멀티 스레드(multi thread)로 구성되어

thread마다 개별 Connection을 사용해 독립적인 작업을 위해 여러 개 사용할 수 있습니다.

EXEC SQL BEGIN DECLARE SECTION;
	char * user = "account1";
	char * pass = "passwd1";
	char * tns = "remote_db1";
	char * conn_str1 = "account1/passwd1";
	char * conn_str2 = "account1/passwd1@remote_db1";
	char conn_name[10];
EXEC SQL END DECLARE SECTION;

int i;
for(i=0;i<thread_count;i++) {

	//Connection 이름을 CONN_1 , CONN_2 .. 으로 지정
	sprintf(conn_name,"CONN_%d",i);

	//아래 4가지중에 편하신걸로 사용하시면 됩니다.

	♠ 로컬 오라클 접속
	EXEC SQL CONNECT :user IDENTIFIED BY :pass AT :conn_name;

	♠ TNS를 이용한 원격 오라클 접속
	EXEC SQL CONNECT :user IDENTIFIED BY :pass AT :conn_name USING :tns;

	♠ 계정,암호 묶어서 접속
	EXEC SQL CONNECT :conn_str1 AT :conn_name;

	♠ 계정,암호,TNS 묶어서 접속
	EXEC SQL CONNECT :conn_str2 AT :conn_name;

}

 

CONNECT에서 AT을 사용할 경우에는

이후 모든 DB 명령어에 반드시 AT을 포함시켜야 됩니다.

EXEC SQL AT :con_name SELECT val_1 FROM T_Table;

EXEC SQL AT :con_name OPEN cursor;

EXEC SQL AT :con_name FETCH cursor;

EXEC SQL AT :con_name COMMIT WORK RELEASE;

 

 

 ORACLE DB 접속 해제하기

 

접속 해제 명령어는 COMMIT/ROLLBACK WORK RELEASE 입니다.

 

COMMIT은 프로그램이 정상 처리되어 변경된 내용을 DB에 최종 적용하는 것이고

ROLLBACK은 프로그램 도중에 오류로 인해

변경된 내용을 다시 변경 전 원래대로 되돌리는 것입니다.

 

if(프로그램 정상){
	EXEC SQL COMMIT WORK RELEASE;
}
else{ //프로그램 오류
	EXEC SQL ROLLBACK WORK RELEASE;
}

if(SQLCODE == 0) {
	printf("DB DisConnect 정상\n");
}
else{
	printf("DB DisConnect 오류\n");
	printf("SQLCODE [%d] , 오류 메시지 [%.*s]\n",sqlca.sqlerrm.sqlerrml-1,sqlca.sqlerrm.sqlerrmc);
}

 

 

감사합니다.

반응형

댓글