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 1651 게시물 읽기
No. 1651
external함수 질문입니다.
작성자
이도희
작성일
2008-06-23 14:58
조회수
10,814

#include <stdio.h>

#include <stdlib.h>

#include <sqlcli1.h>

#include <sqludf.h>

#include <string.h>


int  testInd( char *app, SQLSMALLINT app_ind, SQLSMALLINT *message, SQLUDF_TRAIL_ARGS )

{

  *message = app_ind;   

  return 0;

}


 external 함수로 위와 같이 간단하게 해서 매개변수로 넘어오는 app의 값이 널인지 널이 아닌지를 체크하고 싶습니다.


CREATE function testind( A VARCHAR(128))

returns smallint

EXTERNAL NAME 'testind.so!testInd'

LANGUAGE C

PARAMETER STYLE DB2SQL

READS SQL DATA

EXTERNAL ACTION;


 db2 "values testind('aaa')" 이렇게 호출하거나  db2 "values testind('')" 이렇게 호출하거나 둘다 indicator값이 0이 나옵니다. null을 체크하기 위해 indicator값을 위와 같이 쓰는 것이 맞는지 궁금합니다.


이 글에 대한 댓글이 총 3건 있습니다.

indicatior 파라메터는 db가 null값을 체크할 때 사용되는 변수로 갯수를 맞추어 선언만 해주시면 됩니다. 
db가 사용하는 변수로 이에 대한 코딩부분은 따로 하지 않습니다. 

    (SQLCHAR *)"  CREATE FUNCTION ScalarUDF(CHAR(5), DOUBLE) "
               "    RETURNS DOUBLE "
               "    EXTERNAL NAME 'udfsrv!ScalarUDF' "
               "    FENCED "
               "    CALLED ON NULL INPUT "
               "    NOT VARIANT "
               "    NO SQL "
               "    PARAMETER STYLE DB2SQL "
               "    LANGUAGE C "
               "    NO EXTERNAL ACTION";


------>
void SQL_API_FN ScalarUDF(SQLUDF_CHAR *inJob,
                          SQLUDF_DOUBLE *inSalary,
                          SQLUDF_DOUBLE *outNewSalary,
                          SQLUDF_SMALLINT *jobNullInd,
                          SQLUDF_SMALLINT *salaryNullInd,
                          SQLUDF_SMALLINT *newSalaryNullInd,
                          SQLUDF_TRAIL_ARGS)
{
  if (*jobNullInd == -1 || *salaryNullInd == -1)
  {
    *newSalaryNullInd = -1;
  }
  else
  {
    if (strcmp(inJob, "Mgr  ") == 0)
    {
      *outNewSalary = *inSalary * 1.20;
    }
    else if (strcmp(inJob, "Sales") == 0)
    {
      *outNewSalary = *inSalary * 1.10;
    }
    else /* it is clerk */
    {
      *outNewSalary = *inSalary * 1.05;
    }
    *newSalaryNullInd = 0;
  }
} /* ScalarUDF */

-----------------------------------------------------------
마지막 파라메터 SQLUDF_TRAIL_ARGS는 exception처리에 사용되는 값들을 가지고 있습니다. 

  /* SQLUDF_STATE and SQLUDF_MSGTX are parts of SQLUDF_TRAIL_ARGS */
  if (*inOperand2 == 0.00)
  {
    strcpy(SQLUDF_STATE, "38999");
    strcpy(SQLUDF_MSGTX, "DIVIDE BY ZERO ERROR");
  }
  else
  {
    *outResult = *inOperand1 / *inOperand2;
    *resultNullInd = 0;
  }
} /* ScUDFReturningErr */



조는 냥이님이 2008-06-23 15:41에 작성한 댓글입니다. Edit

int  testInd( SQLUDF_CHAR *appl_id, SQLUDF_SMALLINT *message, SQLUDF_SMALLINT *appl_id_ind, SQLUDF_SMALLINT *message_ind,  SQLUDF_TRAIL_ARGS )

{

  

  if ( *appl_id_ind == -1 )

      *message = 4;   

    else

        *message = 0;


    return 0;

}

냥이님이 알려주신데로 위와 같이 고쳤는데

1.  db2 "values testind('ddd')"


1    

------

     0


  1 record(s) selected.


2. db2 "values testind('')"


1    

------

     0


1번 2번  둘 다 결과값이 0이 나옵니다. 2번은 인풋데이터가 널이므로 indicator값이 -1이 되어서 message 변수 4가 들어가야 하는거 아니예요? 뭐가 잘못되었는지 잘 모르겠습니다 ㅠㅠ

이도희님이 2008-06-23 16:00에 작성한 댓글입니다. Edit

indicator값이 뭐가 되던 선언만 해주면 결과 값이 나와서 님과 같은 생각은 해보지를 않았네요. 
널 indicator값으로 -1이 사용되어야 할 것 같은데 그 부분은 대략적인 설명만 봐서 왜 0이 나왔는지는 잘 모르겠습니다. 

조는 냥이님이 2008-06-23 16:17에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1654begin실행시에 [4]
이도희
2008-06-25
11473
1653트리거의 NEW 값
이도희
2008-06-24
10039
1652윈도용DB2에 대한 SecureCRT같은 프로그램은 없나요? [1]
김건우
2008-06-24
9937
1651external함수 질문입니다. [3]
이도희
2008-06-23
10814
1650트리거 disable 방법 [3]
이도희
2008-06-18
11578
1649백업에 관해서 [1]
김윤정
2008-06-18
9917
1648DB2 UDB V9 migration question [2]
Hyung Kim
2008-06-17
9717
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다