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)';
Copy

データベースオブジェクトを参照する場合、動的 SQL はサポートされません。

動的 SQL を使ってデータベースオブジェクトを参照すると、次のようなテキストを含むエラーが発生します。

Compilation of SQL UDF failed: SQL compilation error: syntax error... unexpected '<variable_name>'

異なるデータベースオブジェクトを使用する動的な SQL ステートメントを構築する必要がある場合は、ハンドラー を 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)
  $$
  ;
Copy