database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
ㆍDB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
DB2 Q&A 1188 게시물 읽기
No. 1188
db2 cli 프로그램 중 ~ 도와주시기 바랍니다......
작성자
김선아(unexpected)
작성일
2006-11-27 17:08
조회수
9,108
테이블은 아래와 같습니다.
-----------------------------------------
CHARACTER         13   JUMIN
VARCHAR             32   NAME
CHARACTER         1    SEX
INTEGER              4    AGE
-----------------------------------------

CLI 프로그램을 짜서 테스트를 하는데....
변수선언은 아래와 같이하고...

    struct {
        SQLCHAR     val[14];
        SQLINTEGER  len;
    } jumin;

    struct {
        SQLCHAR      val[33];
        SQLINTEGER  len;
    } name;

    struct {
        SQLCHAR     val;
        SQLINTEGER  len;
    } sex;

    struct {
        SQLINTEGER  val;
        SQLINTEGER  len;
    } age;


데이타 추출은 아래와 같이 했습니다.(쿼리문은 필드 전체 쿼리입니다.)


RC = SQLGetData(hstmt,  1,  SQL_C_CHAR, jumin.val, sizeof(jumin.val), &jumin.len);
RC = SQLGetData(hstmt,  2,  SQL_C_CHAR, name.val,  sizeof(name.val),  &name.len);
RC = SQLGetData(hstmt,  3,  SQL_C_CHAR, &sex.val,   sizeof(sex.val),   &sex.len);
RC = SQLGetData(hstmt,  4,  SQL_C_LONG, &age.val,   sizeof(age.val),    &age.len);

위와 같이 데이타를 추출을 하는데요...
3번째 필드체크에서 RC = 1 (
SQL_SUCCESS_WITH_INFO) 가 떨어집니다.
위닝이라는데...
왜 그와같은 워닝이 발생되는지요?
잘못된 부분을 집어 주시면 너무 너무 감사하겠습니다....꾸벅

이 글에 대한 댓글이 총 2건 있습니다.
Table 19. DB2 CLI Function return codes
Return code Explanation
SQL_SUCCESS The function completed successfully, no additional SQLSTATE information is available.
SQL_SUCCESS_WITH_INFO The function completed successfully with a warning or other information. Call SQLGetDiagRec() or SQLGetDiagField() to receive the SQLSTATE and any other informational messages or warnings. The SQLSTATE will have a class of '01'.
SQL_STILL_EXECUTING The function is running asynchronously and has not yet completed. The DB2 CLI driver has returned control to the application after calling the function, but the function has not yet finished executing.
SQL_NO_DATA_FOUND The function returned successfully, but no relevant data was found. When this is returned after the execution of an SQL statement, additional information may be available and can be obtained by calling SQLGetDiagRec() or SQLGetDiagField().
SQL_NEED_DATA The application tried to execute an SQL statement but DB2 CLI lacks parameter data that the application had indicated would be passed at execute time.
SQL_ERROR The function failed. Call SQLGetDiagRec() or SQLGetDiagField() to receive the SQLSTATE and any other error information.
SQL_INVALID_HANDLE The function failed due to an invalid input handle (environment, connection or statement handle). This is a programming error. No further information is available.

SQLCODE나 SQLSTATE를 얻기위해서 SQLGetDiagRec() or SQLGetDiagField() 를 호출해보세요. 


utilcli.c의 일부분입니다. 

void HandleDiagnosticsPrint(SQLSMALLINT htype, /* handle type identifier */
                            SQLHANDLE hndl /* handle */ )
{
  SQLCHAR message[SQL_MAX_MESSAGE_LENGTH + 1];
  SQLCHAR sqlstate[SQL_SQLSTATE_SIZE + 1];
  SQLINTEGER sqlcode;
  SQLSMALLINT length, i;

  i = 1;

  /* get multiple field settings of diagnostic record */
  while (SQLGetDiagRec(htype,
                       hndl,
                       i,
                       sqlstate,
                       &sqlcode,
                       message,
                       SQL_MAX_MESSAGE_LENGTH + 1,
                       &length) == SQL_SUCCESS)
  {
    printf("\n  SQLSTATE          = %s\n", sqlstate);
    printf("  Native Error Code = %d\n", sqlcode);
    printf("%s\n", message);
    i++;
  }

  printf("-------------------------\n");
} /* HandleDiagnosticsPrint */

마라도님이 2006-11-27 17:41에 작성한 댓글입니다. Edit

마라도님~
글을 올리기 전에 이리저리 테스트를 해봤었습니다.
올려주신 것도 확인을 해봤었습니다. 그래서 워닝이라는 말도 적은것이었구요.

워닝이 발생하는 부분을 2바이트로 잡고, Get함수 호출시 버퍼사이즈도 2바이트로 하면 워닝없이 제대로 값이 나오더군요.
struct {
        SQLCHAR     val[2];
        SQLINTEGER  len;
    } sex; /* 'Y' or 'X' */

RC = SQLGetData(hstmt,  3,  SQL_C_CHAR, sex.val,   sizeof(sex.val),   &sex.len);

또는 
struct {
        SQLCHAR     val;
        SQLINTEGER  len;
    } sex; /* 'Y' or 'X' */

RC = SQLGetData(hstmt,  3,  SQL_C_CHAR, &sex.val,   2,   &sex.len);
와 같이 해도 워닝없이 값이 제대로 나오더군요.

이런저런 테스트를 해보고..위의 첫번째 방법같이 코딩을 해서 잠시 워닝은 빼 놨습니다만...
워닝 발생시 잘못된 부분을 알고 싶어서... 질문을 올린거랍니다.
Db2를 처음 접근을 해보고....또 영어가 짧아서 ~ 마라도님 글에 답이 있음을 찾아내지 못한것인지....모르겠네요...


참고로 상태와 에러코드는 아래와 같고...메세지는 Data truncated 입니다요..
  SQLSTATE          = 01004
  Native Error Code = -99999

김선아(unexpected)님이 2006-11-27 18:26에 작성한 댓글입니다.
이 댓글은 2006-11-27 18:30에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
1191DB2에서의 AUDIT TRAIL 기능 아시는분 [1]
조성욱
2006-11-28
8802
1190윈도우에서 DB2제거하기 [1]
jina
2006-11-28
9011
1189트리거에서 다른 DB의 테이블에 접근할 수 있나요? [4]
DB2
2006-11-28
11951
1188db2 cli 프로그램 중 ~ 도와주시기 바랍니다...... [2]
김선아
2006-11-27
9108
1187LOB,CLOB,LONG data type도 reorg가 가능합니까? [1]
디비2
2006-11-24
8013
1186DB2 트리거나 함수 바로 작성 어떻게 하나요(8.2) [2]
DB2
2006-11-24
8258
1185oracle - iSeriese AS/400 DB2 [1]
DB2처음이
2006-11-23
8459
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다