例: UDF C関数の作成 - Teradata Database - Teradata Vantage NewSQL Engine - 例: UDF C関数の作成、CREATE FUNCTION (外部形式)およびREPLACE FUNCTION (外部形式)構文の文。

Teradata Vantage™ SQLデータ定義言語 構文規則および例

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/wkf1512081455740.ditamap
dita:ditavalPath
ja-JP/wkf1512081455740.ditaval
dita:id
B035-1144
Product Category
Software
Teradata Vantage

この要求は、Linuxシステム上でユーザー定義C関数を作成します。UDFは、クライアント システム上のログオン ユーザーの現行ディレクトリで、find_text.cという名前のCソース コード ファイルを探します。関数名は、エントリ ポイント名であるfind_textとしなければなりません。

この例は、ユーザー指定の文字列内でユーザー指定のテスト パターンを検索する関数を作成します。関数が許容する最大長の検索文字列およびパターン文字列は、500バイトです。この結果はTまたはFの文字値となり、それぞれ真(テスト パターンが検索文字列内で見つかった)または偽(テスト パターンが検索文字列内で見つからなかった)を表わします。

    CREATE FUNCTION find_text (
     searched_string VARCHAR(500), 
     pattern         VARCHAR(500))
    RETURNS CHARACTER
    LANGUAGE C
    NO SQL
    EXTERNAL
    PARAMETER STYLE SQL;
    
    *** Function has been created. 
     *** Warning: 5607 Check output for possible warnings encountered in compiling XSP/UDF.
     *** Total elapsed time was 5 seconds.
    
    Check output for possible compilation warnings.
    ------------------------------------------------------------
     /usr/bin/cc  -Xc -I /tpasw/etc -c -o find_text.o find_text.c
    Teradata High Performance C Compiler R3.0c
    (c) Copyright 1994-98, Teradata Corporation
    (c) Copyright 1987-98, MetaWare Incorporated
     /usr/bin/cc  -Xc -I /tpasw/etc -c -o pre_another.o pre_another.c
    Teradata High Performance C Compiler R3.0c
    (c) Copyright 1994-98, Teradata Corporation
    (c) Copyright 1987-98, MetaWare Incorporated
     /usr/bin/cc -G  -Xc -I /tpasw/etc -o libudf_03ee_11.so 
    find_text.o pre_find_text.o pre_really_long_function_name.o
    long_name.o pre_udf_scalar_substr.o substr.o pre_Find_Text.o
    pattern.o pre_char2hexint.o char2hexint.o   -ludf -lmw -lm

指定の日付以降の日付を持つ文書内で特定のテキスト記述を検索する以下のSELECT要求は、関数find_textの1つの使用例です。

    USING (age DATE, look_for VARCHAR(500))
    SELECT doc_number, text
    FROM documents
    WHERE (:age <= doc_copyright
    AND   (find_text(text, :look_for) = 'T');