Trafodion 标量UDF

本文主通过一个例子(反转字符串)介绍一下如何在Trafodion中创建并使用标量UDF。主要步骤如下,

1 准备c语言脚本

#include "sqludr.h"

/* Helper function to reverse a string */
static void reverseBytes(void *out, void *in, unsigned int numBytes)
{
  int i;
  char *pOut = (char *) out;
  char *pIn = (char *) in;
  for (i = 0; i < numBytes; i++)
    pOut[i] = pIn[numBytes - (i + 1)];
}

SQLUDR_LIBFUNC SQLUDR_INT32 reverse(SQLUDR_VC_STRUCT *in1,
                                    SQLUDR_VC_STRUCT *out1,
                                    SQLUDR_INT16 *inInd1,
                                    SQLUDR_INT16 *outInd1,
                                    SQLUDR_TRAIL_ARGS)
{
  if (calltype == SQLUDR_CALLTYPE_FINAL)
    return SQLUDR_SUCCESS;
  if (SQLUDR_GETNULLIND(inInd1) == SQLUDR_NULL)
    {
      SQLUDR_SETNULLIND(outInd1);
      return SQLUDR_SUCCESS;
    }
  reverseBytes(out1->data, in1->data, in1->length);
  out1->length = in1->length;
  return SQLUDR_SUCCESS;
}

2 编译上述c程序生成.so文件

[trafodion@cent-2 ~]$ gcc -g -Wall -I$MY_SQROOT/export/include/sql -shared -o udf.so udf.c
[trafodion@cent-2 ~]$ ls -la udf.*
-rw-rw-r-- 1 trafodion trafodion   867 Nov 15 15:48 udf.c
-rwxrwxr-x 1 trafodion trafodion 11024 Nov 15 15:49 udf.so

3 创建LIBRARY

SQL>create library myudfs file '/home/trafodion/udf.so';

--- SQL operation complete.

SQL>get libraries;

Libraries in Schema TRAFODION.SEABASE
=====================================

MYUDFS

--- SQL operation complete.

4 创建UDF

SQL>create function reverse(varchar(32)) returns (reverse varchar(32))
+>external name 'reverse' library myudfs
+>deterministic no sql no transaction required;

--- SQL operation complete.

SQL>get functions;

Functions in Schema TRAFODION.SEABASE
=====================================

REVERSE

--- SQL operation complete.

5 执行UDF

SQL>select reverse('abcdefg') from (values(1));

REVERSE
--------------------------------
gfedcba

--- 1 row(s) selected.

6 查看FUNCTION定义

SQL>showddl function reverse;


CREATE FUNCTION TRAFODION.SEABASE.REVERSE
  (
    IN VARCHAR(32) CHARACTER SET ISO88591
  )
  RETURNS
  (
    OUT REVERSE VARCHAR(32) CHARACTER SET ISO88591
  )
  EXTERNAL NAME 'reverse'
  LIBRARY TRAFODION.SEABASE.MYUDFS
  LANGUAGE C
  PARAMETER STYLE SQL
  NO SQL
  NO FINAL CALL
  NO STATE AREA
  ALLOW ANY PARALLELISM
  DETERMINISTIC
  SAFE EXECUTION MODE
  ;

-- GRANT EXECUTE ON FUNCTION TRAFODION.SEABASE.REVERSE TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值