17.00 - 17.05 - 関数のオーバーロード - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ定義言語 詳細トピック

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

ほとんどの関数名は、関数クラス内で固有である必要はありません。Teradata Databaseは同じ名前の関数のパラメータ型を使用することによりそれらを区別するので、オーバーロード関数名に関連するパラメータ型が異なったものである必要があります。

同じ名前の複数の関数をパラメータ型で区別する必要がある場合、Teradata Databaseは互換性のある型のパラメータの優先順位に基づいて、呼び出す関数を判別します。関数のオーバーロードの詳細については、<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>を参照してください。

関数に入力する際にシステムが要求するパラメータ型が原因で、Teradata Databaseは行レベル セキュリティ ポリシーを実装する関数の名前のオーバーロードをサポートしません。特定のステートメント アクションに対してセキュリティ ポリシーを実行する各UDFについて、同じ数のパラメータと対応するデータ型が要求されます。

セキュリティ ポリシーを実行するUDFのパラメータの間で存在する可能性がある唯一の違いは、制約がnullを許可するかどうかによって、異なるUDFのパラメータがnull標識を含むことも含めないこともあるという点です。

動的UDTを使用すると、オーバーロードした名前をカバーするために複数のUDFを入力パラメータ データ型として作成する必要がなくなるため、関数名のオーバーロードを簡略化できます。動的UDTは、事前割り当て済みの名前VARIANT_TYPEを持つSTRUCTURED型UDTであり、リクエストで渡された属性に基づいて実行時に動的に属性が構築されます。

例えば、DISTINCT型UDTのinteger_udtを作成してから、唯一のパラメータのデータ型としてVARIANT_TYPEを使用するUDFを作成したとします。

CREATE TYPE integer_udt AS INTEGER FINAL;

CREATE FUNCTION udf_agch002002dyn_udt
  (parameter_1  VARIANT_TYPE)
RETURNS INTEGERUDT
CLASS AGGREGATE (4)
LANGUAGE C
NO SQL
EXTERNAL NAME 'CS!udf_agch002002dyn_udt!udf_agch002002dyn_udt.c'
PARAMETER STYLE SQL;

これにより、以下に示すようにタイプの属性を渡すNEW VARIANT_TYPEコンストラクタ式を使用して、実行時に動的STRUCTURED型UDTを構築できるようになります。

SELECT udf_agch002002dyn_udt(NEW VARIANT_TYPE(tbl_1.a AS a,
                                             (tbl_1.b+tbl_1.c)
                                              AS b))
FROM tbl_1;

このリクエストは、abという名前の2つの属性を持つ動的UDTを構築します。<Teradata Vantage™ - SQL演算子およびユーザー定義関数、B035-1210>の「NEW VARIANT_TYPE」を参照してください。

udf_agch002002dyn_udtの定義では、唯一のパラメータにVARIANT_TYPEを使用しているため、以下に示すように簡単にSELECTリクエストを実行できます。システムは、このリクエストをaaおよびbというcの属性を持つ動的UDTを作成することで解決します。

SELECT udf_agch002002dyn_udt(NEW VARIANT_TYPE(tbl_1.a AS a,
                                              tbl_1.b AS b,
                                              tbl_1.c AS c)
FROM tbl_1;

上記の説明のように、入力パラメータのデータ型としてVARIANT_TYPEを使用してUDFを定義すると、オーバーロードした関数のリクエストを解決するために複数のUDFを作成する手間を省けます。

VARIANT_TYPE UDTはインポートもエクスポートもできません。VARIANT_TYPEを異なるタイプにキャストすることもできません。

Javaで記述された外部ルーチンは、動的UDTを使用して記述されたUDFのVARIANT_TYPEとTD_ANYTYPEをサポートしないことに注意してください。これらの関数を記述するには、関数の外部ルーチンをCまたはC++で記述する必要があります。

TD_ANYTYPEをパラメータまたは戻り値のデータ型として使用し、関数を定義することによって、名前ではなくサーバー文字セットまたは数値の精度に基づいて関数をオーバーロードできます。TD_ANYTYPEを使用して関数を定義するとき、Teradata Databaseは、提供されるパラメータに基づき、実行時にパラメータと戻り値のデータ型を判別します。

TD_ANYTYPEを未判別の属性を持つパラメータ データ型のタイプの別名として使用できるだけでなく、TD_ANYTYPEを使用してすべての可能なパラメータ データ型を解釈できます。これにより、同じ基本関数に対して開発する関数シグネチャの数が少なくなるだけでなく、要求される関数の動作のロジックを柔軟にコーディングできます。

ただし、パラメータ データ型としてTD_ANYTYPEを使用すると、入力値を関数シグネチャに一致する値に自動的に変換する暗黙的なUDF変換が失われます。そのため、未定義のパラメータが適切に解釈されて処理されていることを必ず確認する必要があります。

TD_ANYTYPEの詳細について、<Teradata Vantage™ - データ タイプおよびリテラル、B035-1143>を参照してください。また、TD_ANYTYPEデータ型を利用するUDFのコーディング方法の詳細について、<Teradata Vantage™- SQL外部ルーチン プログラミング、B035-1147>を参照してください。

Teradata Databaseはパラメータのルールのセットを使用して、関数名が固有であるかどうかを判別します。以下のリストで、そのルールを示します。
  • 以下の数値パラメータ データ型は、関数が固有であるかどうかを判別するための優先順位に従ってリストされています。たとえば、BYTEINTはSMALLINT内に収まり、SMALLINTはINTEGER内に収まります。反対に、FLOATをINTEGER内に収めようとすると、情報が失われる可能性があります。
    これらのデータ型は別個のものですが、互換性があります。1つの数字を共有する複数のデータ型は同義語であり、互いに別個のものではありません。
    • BYTEINT
    • SMALLINT
    • INTEGER
    • DECIMAL, NUMERIC

      データ型DECIMALとNUMERICのサイズ指定は、関数が別個のものであるかどうかに影響しません。たとえば、DECIMAL(8,3)とDECIMAL(6,2)は、関数が固有であるかどうかに関して同じ意味を持ちます。

    • FLOAT1, DOUBLEPRECISION, REAL
  • 以下の文字パラメータ データ型は、関数が固有であるかどうかを判別するための優先順位に従ってリストされています。

    これらのデータ型は別個のものですが、互換性があります。1つの文字を共有する複数のデータ型は同義語であり、互いに別個のものではありません。文字列の長さ指定は、関数が別個のものであるかどうかに影響しません。たとえば、CHARACTER(10)とCHARACTER(5)は、関数が固有であるかどうかに関して同じ意味を持ちます。また、CHARACTER SET句は、関数の固有性の判別について影響がありません。

    文字列の長さ指定は、関数が別個のものであるかどうかに影響しません。例えば、CHARACTER(10)とCHARACTER(5)は、関数が固有であるかどうかに関して同じ意味を持ちます。CHARACTER SET句も、関数が固有であるかどうかの判別に影響しません。
    • CHARACTER
    • VARCHAR, CHARACTERVARYING, LONGVARCHAR
    • CHARACTER LARGE OBJECT
  • 以下のグラフィック パラメータ データ型は別個のものですが、互換性があります。1つの箇条書きで書かれている複数のデータ型は同義語であり、互いに別個のものではありません。
    • GRAPHIC
    • VARGRAPHIC, LONG VARCHAR CHARACTER SET GRAPHIC
  • 以下のバイト パラメータ データ型は別個のものですが、互換性があります。
    • BYTE
    • VARBYTE
    • BINARY LARGE OBJECT
  • 日付、時刻、タイムスタンプ、間隔のパラメータ データ型はすべて別個のものです。
  • 同名の既存の関数のパラメータ数が異なっているか、または1つ以上のパラメータで関数パラメータ データ型が互いに異なる場合、定義する関数は固有と見なされます。
  • 複数の関数に同じfunction_nameがある場合は、
specific_function_nameを入力する必要があります。
  • 関数名のオーバーロードは、1つのデータベース内の同一のクラス内でのみ可能です。例えば、同じデータベース内にあるスカラー関数と集約関数とに同一のfunction_nameを指定することはできません。