sqlglm 함수를 이용한 오류 메시지 출력하기


pro*c에서 쿼리 실행시 오류가 발생하면 sqlca 구조체에 sqlerrm 구조체에 있는 것을 활용하여 메시지를 출력을 할 수 있으나

sqlerrm.sqlerrmc가 항상 마지막 문자열에 null을 주는 것이 아니라 메시지가 제대로 출력 되지 않아 sqlerrm.sqlerrml 로 길이를 구해서

출력해야 되는 번거로움이 있다.

이런 번거로움 대신 sqlglm 함수를 사용하여 간단하게 메시지를 출력 해보자.



sqlglm 함수 알아보기


아래와 같이 해더를 추가한다.


    #include <sqlcpr.h>


함수의 원형은 아래와 같다.

void sqlglm( char* message_buffer, size_t * buffer_size, size_t * message_length);



오류 메시지 출력하는 예제를 보겠다.



#include <sqlcpr.h>

....

....


char msg_buf[512] = {0,};

size_t size_buf = 512;

size_t msg_len = 0;


EXEC SQL 

    UPDATE USER_TBL 

SET AGE = '50'

WHERE NAME LIKE '%Suzan%';


if( sqlca.sqlcode != 0 && sqlca.sqlcode != 1403 )

{

sqlglm( msg_buf, &size_buf, &msg_len );

prinf(" error[%s] \n", msg_buf );

}


반응형

'프로그램 > Pro*c' 카테고리의 다른 글

[Pro*c] sqlca 구조체 설명 ( 오류 처리 )  (0) 2017.07.17
[Pro*c] Connect, DisConnect  (0) 2016.11.22

Sqlca 구조체 설명 및 오류 처리


Pro*c에서 쿼리를 실행 할 때 마다 sqlca로 결과를 전달 해 준다.

그래서 sqlca의 구조체를 이해해야 오류 발생시 적절하게 조치 하는데 필요하다.



Sqlca 알아보기


아래와 같이 해더를 추가한다.


    #include <sqlca.h>

    혹은

EXEC SQL INCLUDE SQLCA;


위의 해더에는 아래와 같은 구조체를 활용 하여 에러 처리를 한다.

  struct sqlca

{

char sqlcaid[8]; 

long sqlabc;

long sqlcode;    // oracle error code 저장


struct

{

unsigned short sqlerrml; // 오류메시지 길이

char sqlerrmc[70];       // 오류메시지

} sqlerrm;


char sqlerrp[8];

long sqlerrd[6];

char sqlwarn[8];

char sqlext[8];

};


struct sqlca sqlca;


각 구조체 상세 설명은 아래와 같다.

sqlca.sqlcode

 sqlca.sqlcode == 0 

 정상 처리

 sqlca.sqlcode == 1403

 조회된 데이터 없음

 sqlca.sqlcode == 100

 insert 된 데이터 없음 ( 컴파일 옵션이 MODE=ANSI 일 때 )

 sqlca.sqlcode < 0

 오류 발생


sqlca.sqlerrd

 sqlca.sqlerrd[2]

 select 조회 건수

 fetch 누적 조회 건수

 insert, update, delete 건수

 sqlca.sqlerrd[4]

 sql문 오류가 발생한 위치



오류 처리 예제를 보겠다.



#include <sqlca.h>

....

....


EXEC SQL 

    UPDATE USER_TBL 

SET AGE = '50'

WHERE NAME LIKE '%Suzan%';


if( sqlca.sqlcode == 0  )

{

prinf(" 정상 처리, 처리 된 건 수[%d] \n", sqlca.sqlerrd[2]);

}

else if( sqlca.sqlcode == 1403 )

{

      printf(" 조회된 건 수가 없음 \n" );

}

else if( sqlca.sqlcode < 0 )

{

     printf(" 오류 발생, code[%d] msg[%s] \n" sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc  );

}


반응형

Pro*c DB 접속, 접속 해제



Pro*c?



오라클을 접근 및 제어를 위한 라이브러리 이다.

*.pc 파일로 만들어 오라클에서 제공하는 선행 컴파일러를 실행하면 .c로 변환시켜 주며

이것을 gcc로 컴파일 하여 실행 파일인 오브젝트를 생성하여 오라클 제어 프로그램을 만들 수 있다.


DB 접속 방법


이제 DB 접속 하는 방법과 예제를 살펴 보면서 Pro*c 사용 방법을 익히도록 하겠다.

 EXEC SQL CONNECT :userId IDENTIFIED BY :userPw;


위와 같은 명령어를 사용해 DB에 접속 할 수 있다.

이후 DML ( SELECT, UPDATE... 등) 실행이 가능하다. 


아래 접속 예제입니다.



#include <stdio.h>

EXEC SQL include sqlca.h;


#define SQL_CODE sqlca.sqlcode

#define SQL_NOT_FOUND 1403

#define SQL_SUCCESS 0


typedef enum

{

    false,

    true

}Boolean;    //성공,실패



Boolean ConnectDB()

{

    EXEC SQL BEGIN DECLARE SECTION;

       VARCHAR         userId[50];

       VARCHAR         userPw[50];

    EXEC SQL END DECLARE SECTION;


    strcpy(userId.arr,"identify");

    userId.len = strlen(userId.arr);

    strcpy(userPw.arr,"password");

    userId.len = strlen(userPw.arr);


    EXEC SQL CONNECT :userId IDENTIFIED BY :userPw;


    if (SQL_CODE != SQL_SUCCESS)

    {

        return false;

    }

    return true;

}





DB 접속 해제


이제 DB 접속 해지 하는 방법은 아래와 같습니다.

 EXEC SQL COMMIT WORK RELEASE;


프로그램 종료 전에는 항상 DB접속을 해제 시켜 주도록 합시다.


아래 접속 예제입니다.


#include <stdio.h>

EXEC SQL include sqlca.h;


#define SQL_CODE sqlca.sqlcode

#define SQL_NOT_FOUND 1403

#define SQL_SUCCESS 0


typedef enum

{

    false,

    true

}Boolean;    //성공,실패



Boolean ConnectDB()

{

    EXEC SQL BEGIN DECLARE SECTION;

       VARCHAR         userId[50];

       VARCHAR         userPw[50];

    EXEC SQL END DECLARE SECTION;


    strcpy(userId.arr,"identify");

    userId.len = strlen(userId.arr);

    strcpy(userPw.arr,"password");

    userId.len = strlen(userPw.arr);


    EXEC SQL CONNECT :userId IDENTIFIED BY :userPw;


    if (SQL_CODE != SQL_SUCCESS)

    {

        return false;

    }

    return true;

}


Boolean CloseDB()

{

     EXEC SQL COMMIT WORK RELEASE;

}


void main(void)

{

     ConnectDB();

     CloseDB();

}


반응형

+ Recent posts