Teradata自定义函数UDF

Teradata支持C语言的自定义函数。具体部署方法如下:

1、如下UDF存储到文件中,文件名称为chs_instr.udf

/*
database syslib;
replace FUNCTION chs_instr(srcStr VARCHAR(1024), childStr VARCHAR(64)) 
RETURNS INTEGER 
LANGUAGE C 
NO SQL 
PARAMETER STYLE TD_GENERAL 
EXTERNAL NAME chs_instr;
sel chs_instr('弢1234|', '|');
sel index('弢1234|', '|');
*/

2、如下为UDF定义中引用的C函数,文件名称为chs_instr.c

#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
/* Result is 0, if search_str does not apper in source_string               */
/*        index, a pos(start at 1) to the firt occurrence of search_str of source_string */
void chs_instr(VARCHAR_LATIN *source_string,VARCHAR_LATIN *search_str,
  int *result,
  char sqlstate[6])
{
    unsigned char *src = source_string, *sub = search_str, c;
  int sublen = strlen(sub);
    int slen = strlen(src);
    int spos = 0;
    *result = 0;
    while ( spos <= slen-sublen ) {
    if (memcmp(src+spos, sub, sublen) == 0) { 
      *result = spos+1; 
      break; 
    }
        c = src[spos++];
        if (c > 128) spos++;
    }
    return;
}

3、使用bteq登录数据库(dbc用户),指定UDF默认存储数据库为syslib。

bteq "logon citic/dbc,dbc" < chs_instr.udf

 附录:memcmp函数是按字节比较的。

s1,s2为字符串时候memcmp(s1,s2,1)就是比较s1和s2的第一个字节的ascII码值;
memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值;
如:char *s1="abc";
char *s2="acd";
int r=memcmp(s1,s2,3);
就是比较s1和s2的前3个字节,第一个字节相等,第二个字节比较中大小已经确定,不必继续比较第三字节了。所以r=-1.

猜你喜欢

转载自www.cnblogs.com/badboy200800/p/9784654.html
今日推荐