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  );

}


반응형

시간차 구하기


gettimeofday 함수를 활용하여 시간차이를 구하는 방법을 살펴 보겠다. 

참고로 해당 함수는 windows에서 동작하지 않고 unix, linux 환경에서 동작한다.



포인터의 자료형


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


#include <time.h>


위의 해더에는 아래와 같은 구조체가 존재하며 해당 구조체는 gettimeofday 호출시 필요하다.

  struct timeval {

        time_t          tv_sec;         /* seconds */

        suseconds_t     tv_usec;        /* and microseconds */

  };


이제 전체 시간 구하는 전체 예제를 확인해 보겠다.



#include <stdio.h>

#include <time.h>


int main()

{

struct timeval startTime, endTime, gepTime;


gettimeofday( &startTime, NULL );


sleep(1);


gettimeofday( &endTime, NULL );


gepTime.tv_sec = endTime.tv_sec - startTime.tv_sec;

gepTime.tv_usec = endTime.tv_usec - startTime.tv_usec;

if ( gepTime.tv_usec < 0 )

{

gepTime.tv_sec = gepTime.tv_sec - 1;

gepTime.tv_usec = gepTime.tv_usec + 1000000;

}


printf("ellapsed time [%02d.%02d] second\n", gepTime.tv_sec, gepTime.tv_usec);

}



반응형

'프로그램 > C' 카테고리의 다른 글

[C] Call-By-Value와 Call-By-Reference  (0) 2017.07.22
[C] 포인터와 배열  (0) 2017.07.19
[C] 포인터 자료형  (0) 2017.07.13
[C] 포인터 기초  (0) 2017.07.06
[C] 배열 사용법  (0) 2017.03.22

포인터 자료형


포인터에도 int* i, char *ch, double* do...등등 처럼 여러개의 자료형이 존재 한다.

이처럼 여러개의 자료형이 존재 하는 이유는 포인터가 가리켜야 할 자료 사이즈를 정확히 알기 위해서다.



포인터의 자료형


다음 그림을 통해 이해를 도와 보도록 하겠다.

위에 그림은 int 자료형 데이터를 char*, int* 두개를 가리키도록 했다.

int 자료형은 4byte인데 char*로 가리키면 어떻게 될까?

char형은 1바이트 밖에 안되서 char*의 값은 제대로 가져 올 수가 없다.


#include <stdio.h>


int main()

{

int nValue = 10;

int* pInt = &nValue;

char* pCh = &nValue; //해당 구문이 어떤결과를 나타낼지 예측하기 어렵다.
        printf(" %d %d \n", *pInt, *pCh );

}



그림을 예제를 구성해 봤습니다.

보다 컴파일러 마다 컴파일시 결과가 틀리다 어떤 것은 자료형이 다르면  Error가 발생해 

실행이 안 될 수도 있고 Warnning만 발생할 수도 있다.

printf 결과도 컴파일러 OS별로 천차 만별이다. 

(windows10, visual c++에서는 char*에 int 주소를 넣었을때 친절하게 컴파일 오류가 발생한다.)


여기서 말하고자 하는 것은 포인터 자료형을 실제 데이터의 자료형과 일치 하도록 주의를 기울여야 프로그램을 작성해야

여러분이 원하는 올바른 결과를 얻을 수 있습니다.








반응형

'프로그램 > C' 카테고리의 다른 글

[C] 포인터와 배열  (0) 2017.07.19
[C] 시간차이 구하기 ( millisecond 까지.. )  (0) 2017.07.16
[C] 포인터 기초  (0) 2017.07.06
[C] 배열 사용법  (0) 2017.03.22
[C] goto 제어문 사용법  (0) 2017.03.18

책은 현재 직장을 그만두고 이후에 어떻게 돈을 벌지, 어떻게 살아가야 할지에 대한 준비 과정을 저자의 경험을 비추어 설명한 책이다.

 

내가 책을 읽기 전에는 퇴사 막연하게 다음 좋은 직장을 옮기거나 내가 하고 싶은 글쓰기 일을 하면 좋을 같다는 생각을 했었으며 또한 나에게 퇴사 은퇴라는 아직 생각 해본 적이 없어서 가볍게 책을 읽었다.

 

저자는 삼성전자를 그만두고 1년동안 자신이 있는 일을 찾기 위해 고군분투 하는 과정의 이야기를 전해 들었을 역시 내가 생각 했던 보다 세상은 쉽지 않다는 것을 깨달았다.

 

저자가 그만두고 3개월 동안 책을 쓰면서 여러 출판사에 제안을 했지만 많은 고배를 마신 출판 계약을 있었다고 했다.

또한 저자는 글을 쓰는 것을 아주 좋아했다고 하는데 과연 내가 책을 있을까 혹은 많은 책을 읽고 많은 지식을 쌓을 있을까 고민을 하는 계기가 되었다.

 

저자는 스타트업 회사에서 많은 일들을 경험하면서 여러 차례 실패와 쓴맛을 경험 여러 사람과 관계를 맺는데 모회사 업체 대표와 같이 일을 시작하면서 퇴사 학교라는 교육 기관을 설립하게 된다.

 

퇴사 학교는 벨기에 평생 교육 기관과 비슷한 역할을 하기를 기대하며 설립하였다고 하는데 교육 기관은 17 이후면 언제든지 입학이 가능하고 자신의 진로를 탐색할 있게 해주는 이였다.

 

또한 험한 세상을 살아 가기 위해 계획과 자기 관리 특히 실행력을 강조 하였다.

반응형

+ Recent posts