DML文中でUDFが使用されている場合に、それに渡される引数の型は、必ずしも関数定義における対応するパラメータ宣言と厳密に一致している必要はありませんが、互換性のあるものでなければならず、互換データ型に適用される優先順位ルールに従っていなければなりません。
例えば、INTEGERパラメータを宣言する関数を定義した場合、BYTEINT引数を指定してその関数を呼び出して正常に実行されるということは可能です。BYTEINT型とINTEGER型には互換性があり、BYTEINTをINTEGERとして指定できるからです。
しかし、FLOAT引数を指定してその関数を呼び出した場合、FLOATはINTEGERと互換性があるものの、互換データ型に適用される優先順位ルールのため、正常に実行されません。FLOATをINTEGERとして指定すると、情報が失われてしまいます。
互換性のあるデータ型をグループごとにまとめると、次のようになります。データ型は優先順位の高い順に示されています。ここに示されているデータ型は、互換データ型としてそれより後に示されている他のデータ型よりも優先されます。
グループ | 互換データ型の優先順位リスト |
---|---|
文字 |
|
グラフィック |
|
バイト |
|
数値 |
|
スラッシュ( / )で区切られているデータ型は互いに同義語であり、その優先順位は同じです。
正確な精度を保持することが重要でない場合に、すべての数値データ型を受け入れる関数を定義するには、関数パラメータをREAL、FLOAT、またはDOUBLE PRECISIONとして定義します。このようにすれば、すべての数値型は互換性があり、関数の呼び出し前にREALデータ型に変換されるので、関数はすべての数値データ型を受け入れることができます。
DATE、TIME、UDTなど、この優先順位テーブルに示されていないデータ型は、他のどのデータ型とも互換性がありません。
対応するパラメータ型と互換性のない引数を渡すには、関数の呼び出し時に明示的にその引数を適切なデータ型に変換する必要があります。
- TD_ANYTYPEパラメータを使用する。このパラメータでは、すべてのシステム定義のデータ型またはユーザー定義型(UDT)を受け入れることができます。詳細については、TD_ANYTYPE型を使用する関数の定義を参照してください。
- 関数名のオーバーロードを使用する。これにより、パラメータのデータ型が異なる複数の関数を同じ名前で定義できます。詳細については、関数名のオーバーロードを参照してください。