この例はLATINまたはUNICODEの入力名パラメータを受け入れるUDFを示します。
SQL定義
REPLACE FUNCTION GetQBValueExample(
SearchType SMALLINT,
QBName TD_ANYTYPE)
RETURNS VARCHAR(257) CHARACTER SET UNICODE
LANGUAGE C
NO SQL
PARAMETER STYLE TD_GENERAL
EXTERNAL NAME 'CS!GetQBValExample!GetQBValExample.c';
C関数定義
#define SQL_TEXT Latin_Text
#include<string.h>
#include<sqltypes_td.h>
typedef unsigned short int word;
#define EVLLATIN1 1
#define EVLUNICODE 2
extern void
FNC_GetQueryBandU(void *QBandBuf,
int BufSize,
int *QBandLen);
extern void
FNC_GetQueryBandValueU (
void *QBandBuf,
FNC_QBSearch_et QB_SearchType,
void *QBName,
void *QBValue,
word QBCharType,
word NameCharType);
#define OKState "00000"
#define InvalidParamState "22023"
#define InsuffMemoryState "54001"
/****************************************************/
void GetQBValueExample(
void *QBName,
VARCHAR_UNICODE *QBValue,
char sqlstate[6])
{
int QBandLen;
int minQBLen = 5;
VARCHAR_UNICODE *QBandBuf;
word NameCharType;
int numAnytypeParams;
anytype_param_info_t inputInfo[1];
int MaxQBLen;
MaxQBLen = FNC_MAXQUERYBANDSIZE_U;
/* QBName is TD_ANYTYPE */
FNC_GetAnyTypeParamInfo(sizeof(anytype_param_info_t),
&numAnytypeParams, inputInfo);
if ((numAnytypeParams >= 0) &&
(inputInfo[0].paramIndex == 1) &&
((inputInfo[0].datatype == VARCHAR_DT) ||
(inputInfo[0].datatype == CHAR_DT))
)
{
if (inputInfo[0].charset == LATIN_CT)
NameCharType = EVLLATIN1;
else
NameCharType = EVLUNICODE;
}
else
{
strcpy(sqlstate, InvalidParamState);
return;
}
/* allocate buffer for the queryband */
QBandBuf = FNC_malloc(MaxQBLen);
if (QBandBuf == NULL)
{
strcpy(sqlstate, InsuffMemoryState);
return;
}
/* Get the queryband */
FNC_GetQueryBandU(QBandBuf, MaxQBLen, &QBandLen);
if (QBandLen >= minQBLen)
{
/* Get the value */
FNC_GetQueryBandValueU(QBandBuf, 0, QBName, QBValue,
EVLUNICODE, NameCharType);
}
else
{
/* Return an empty string for the value */
memcpy(QBValue, "\0\0", 2);
}
FNC_free(QBandBuf);
strcpy(sqlstate, OKState);
return ;
}