SQL UDF の制限事項¶
このトピックでは、 SQL で記述されたハンドラーの制限事項について説明します。
引数および戻り型の制約が無視される場合がある¶
引数や戻り値に対して宣言された特定の型特性は、 UDF が呼び出されたときに無視されます。こうした場合は、宣言で指定された制約に適合しているか否かにかかわらず、受信した値をそのまま使用することができます。
SQL でロジックが記述されている UDFs については、以下が無視されます。
型 NUMBER の引数および戻り値の精度およびスケール
型 VARCHAR の引数および戻り値の長さ
例¶
次の例のコードでは 、 arg1
引数と戻り値は、1文字以下の VARCHAR でなければならないと宣言しています。ただし、 arg1
の値が1文字よりも長い場合にこの関数を呼び出すと、制約が指定されていないかのように成功します。
CREATE OR REPLACE FUNCTION tf (arg1 VARCHAR(1))
RETURNS VARCHAR(1)
LANGUAGE SQL AS 'SHA2(a)';
データベースオブジェクトを参照する場合、動的 SQL はサポートされません。¶
動的 SQL を使ってデータベースオブジェクトを参照すると、次のようなテキストを含むエラーが発生します。
Compilation of SQL UDF failed: SQL compilation error: syntax error... unexpected '<variable_name>'
異なるデータベースオブジェクトを使用する動的な SQL ステートメントを作成する必要がある場合は、代わりにストアドプロシージャを記述することを検討してください。ストアドプロシージャは、次のいずれかの言語で記述できます。
例¶
次の例のコードは、 IDENTIFIER 関数を使用して table_name_parameter
変数で動的に指定された名前のテーブルを参照しているため、失敗します。
CREATE OR REPLACE FUNCTION profit2(table_name_parameter VARCHAR)
RETURNS NUMERIC(11, 2)
AS
$$
SELECT SUM((retail_price - wholesale_price) * number_sold)
FROM IDENTIFIER(table_name_parameter)
$$
;