17.00 - 17.05 - UDMのソース コードの開発 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

UDMの本体は、CまたはC++プログラミング言語を使用して開発します。

サービスとして提供されているVantage delivered as-a-service(AWSまたはAzureで実行中のVantage)、独自のC++およびJava UDF、UDF、UDT、または外部ストアド プロシージャを作成できません。

ソース コードの内容

以下のトピックでは、UDMのCまたはC++ソース コードの内容について説明します。一般に、CまたはC++ソース コードでは、以下のことを実行する必要があります。
  • SQL_TEXT定数の定義
  • sqltypes_td.hヘッダー ファイルのインクルード
  • CREATE TYPE文のMETHOD指定の中で指定されているパラメータ受渡し規則に定められた順序でのパラメータ リストの定義

内部データと外部データ

すべてのデータは、UDMに対してローカルです。メソッドの呼び出しの間でグローバル データは保持されません。ただし、GLOPデータだけは例外です。GLOPデータの使用について詳しくは、グローバル持続データを参照してください。

UDMに静的変数を含めることはできません。

UDM内で、静的定数を使用することはできます。

I/O

以下のルールが入出力に適用されます。

UDMの動作 UDMでの規則
非保護実行モードで実行される場合 標準入出力およびネットワーク入出力を含む、すべての入出力を実行できません。
保護実行モードで実行される場合 入出力を実行するか、オペレーティング システムと対話して、オペレーティング システムがファイル ハンドルやオブジェクト ハンドルなどのリソースを保持するようにできます。

このメソッドは、'tdatuser'オペレーティング システム ユーザーの許可の下で別個のプロセスとして実行されます。

メソッドは、完了前にオープンしているリソースを解放する(つまり、ハンドルを閉じる)必要があります。

保護実行モードの詳細については、保護モードでの実行を参照してください。

CREATE METHOD文またはREPLACE METHOD文にEXTERNAL SECURITY句が指定されている場合 入出力を実行するか、オペレーティング システムと対話して、オペレーティング システムがファイル ハンドルやオブジェクト ハンドルなどのリソースを保持するようにできます。

このメソッドは、CREATE AUTHORIZATION文またはREPLACE AUTHORIZATION文によって確立された特定のネイティブ オペレーティング システム ユーザーの許可の下で別個のプロセスとして実行されます。

メソッドは、完了前にオープンしているリソースを解放する(つまり、ハンドルを閉じる)必要があります。

シグナル処理

SIGUSR2のシグナルはTeradata Databaseにより予約されているため、Linuxシステム上で実行されているUDMは、SIGUSR2のシグナルの使用や処理の変更はできません。

C標準ライブラリ関数

非保護モードで実行するUDMでは、文字列ライブラリ関数など、Cの標準ライブラリ関数のうち、入出力機能を使用しないものを呼び出すことができます。

mallocfreeなど、いくつかの関数には制限があります。

詳細については、<C標準ライブラリ関数の使用>を参照してください。

Teradataライブラリ関数

Teradataには、UDM開発で使用できる関数がいくつか用意されています。例えば、FNC_GetDistinctValue関数を使用することにより、UDMに関連付けられているDISTINCT型の値を取得することができます。

詳細については、<Cライブラリ関数>を参照してください。

システムV IPCおよびPOSIX IPCの使用上の問題

Teradataは、UDF、UDM、および外部ストアド プロシージャにシステムV IPC、またはセマフォー、ミューテックス、条件変数および共有メモリなどのPOSIX IPCを使用しないことをお勧めしております。 Teradata Cライブラリは、これらのIPCリソースの割り当てや割り当て解除用のFNC関数は提供しておりません。 セッション アボートや予期せぬイベントが原因で、Teradataが外部ルーチンの実行スレッドやプロセスを中断する場合には、これらのIPCリソースがシステム内でクリーンアップされずに残る恐れがあります。 まれなケースとして、これによりシステムのハングやOSリソースのリークが生じることがあります。

exit()システム呼び出しを使用した場合の影響

UDMからはexit()を呼び出さないでください。

UDMでexit()を呼び出すと、以下のような結果になります。
  • UDMを呼び出したリクエストはロール バックされます。
  • サーバー プロセスが終了します。次のUDMのためにサーバー プロセスを再作成する必要があるため、新たなオーバーヘッドが発生します。