Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 文 » SQL 文 (A ~ D)

 

CREATE FUNCTION 文

この文は、データベースにユーザ定義 SQL 関数を作成するために使用します。外部関数インタフェースの作成方法については、CREATE FUNCTION 文 [外部プロシージャ]を参照してください。Web サービス関数の作成方法については、CREATE FUNCTION 文 [Web サービス]を参照してください。

CREATE [ OR REPLACE | TEMPORARY ] FUNCTION [ owner.]function-name 
( [ parameter, ... ] )
RETURNS data-type 
[ SQL SECURITY { INVOKER | DEFINER } ]
[ ON EXCEPTION RESUME ]
[ [ NOT ] DETERMINISTIC ]
compound-statement | AS tsql-compound-statement
parameter :
   [ IN ] parameter-name data-type [ DEFAULT expression ]
tsql-compound-statement:
sql-statement
sql-statement
 ...
パラメータ
  • OR REPLACE 句   CREATE OR REPLACE FUNCTION を指定すると、新しい関数が作成されるか、同じ名前の既存の関数が置き換えられます。置き換えの場合、この句によって関数の定義は変更されますが、既存のパーミッションは保持されます。

    OR REPLACE 句をテンポラリ関数で使用することはできません。

  • TEMPORARY キーワード   CREATE TEMPORARY FUNCTION を指定すると、作成した接続でのみ参照できる関数になり、接続を削除すると関数も自動的に削除されます。テンポラリ関数を明示的に削除することもできます。テンポラリ関数に対して ALTER、GRANT、または REVOKE は実行できません。また他の関数とは異なり、テンポラリ関数はカタログやトランザクション・ログに記録されていません。

    テンポラリ関数は、作成者 (現在のユーザ) または指定された所有者のパーミッションで実行されます。テンポラリ関数に所有者を指定できるのは次の場合です。

    • テンポラリ関数が永続的なストアド・プロシージャ内に作成された場合

    • テンポラリ関数と永続的なストアド・プロシージャとで所有者が同じ場合

    テンポラリ関数の所有者を削除するには、テンポラリ関数を先に削除する必要があります。

    読み込み専用のデータベースに接続するときに、テンポラリ関数の作成と削除を行うことができます。

    OR REPLACE 句をテンポラリ関数で使用することはできません。

  • SQL SECURITY 句   SQL SECURITY 句は、INVOKER (関数を呼び出すユーザ) または DEFINER (関数を所有するユーザ) として関数が実行されるかどうかを定義します。デフォルトは DEFINER です。

  • compound-statement   BEGIN と END で囲まれ、セミコロンで区切られた SQL 文のセット。BEGIN 文を参照してください。

  • tsql-compound-statement   Transact-SQL 文のバッチ。Transact-SQL のバッチの概要CREATE PROCEDURE 文 [T-SQL]を参照してください。

  • ON EXCEPTION RESUME 句   Transact-SQL のようなエラー処理を使用します。CREATE PROCEDURE 文を参照してください。

  • [ NOT ] DETERMINISTIC 句   この句は、関数が決定的か非決定的かを示すために使用します。この句が省略されると、関数の決定的な動作は指定されません (デフォルト)。

    DETERMINISTIC と宣言された関数は、同じパラメータ・セットで呼び出されるたび、同じ値を返します。

    NOT DETERMINISTIC と宣言された関数は、同じパラメータ・セットに対して同じ値を返すとはかぎりません。NOT DETERMINISTIC として宣言された関数は、クエリで呼び出されるたびに再評価されます。特定のパラメータ・セットに対して関数が返す結果が変化するとわかっている場合は、この句を使用してください。

    また、基本となるデータの修正などの関連する動作を伴う関数は、NOT DETERMINISTIC として宣言してください。たとえば、プライマリ・キー値を生成し、INSERT ... SELECT 文で使用する関数は、次のように NOT DETERMINISTIC として宣言してください。

    CREATE FUNCTION keygen( increment INTEGER )
    RETURNS INTEGER
    NOT DETERMINISTIC
    BEGIN
      DECLARE keyval INTEGER;
      UPDATE counter SET x = x + increment;
      SELECT counter.x INTO keyval FROM counter;
      RETURN keyval
    END
    INSERT INTO new_table
    SELECT keygen(1), ...
    FROM old_table;

    特定の入力パラメータに対して常に同じ値を返す関数は、DETERMINISTIC として宣言できます。

備考

CREATE FUNCTION 文はデータベースに関数を作成します。所有者名を指定すれば、別のユーザに対する関数を作成できます。パーミッションによる制御はありますが、関数は他の非集合関数とまったく同様に使用できます。

パラメータ名は、データベース識別子に対するルールに従って付けてください。パラメータ名は、有効な SQL データ型にします。また、キーワード IN のプレフィクスを付けて、引数が関数に値を提供する式であることを示してください。

関数を実行するときに、すべてのパラメータを指定する必要はありません。CREATE FUNCTION 文の中にデフォルト値がある場合、不明のパラメータにデフォルト値を割り当てます。呼び出すときに引数を指定せず、デフォルトも設定されていない場合には、エラーが発生します。

SQL SECURITY INVOKER が指定されている場合は、プロシージャを呼び出すユーザごとに注釈を行う必要があるためメモリ使用量が増えます。また、SQL SECURITY INVOKER が指定されている場合は、呼び出し側としても名前の決定が行われます。このため、すべてのオブジェクト名 (テーブル、プロシージャなど) を該当する所有者で修飾する場合は注意が必要です。

NOT DETERMINISTIC と宣言されないかぎり、すべての関数は決定的として扱われます。決定的関数は、同じパラメータに対して一貫した結果を返し、副次効果はありません。つまり、データベース・サーバは、同じパラメータを持つ同じ関数が連続して 2 回呼び出されている場合は、どちらの呼び出しでも同じ結果が返され、クエリのセマンティックに不要な弊害は生じないものと見なします。

関数が結果セットを返す場合、出力パラメータを設定したり戻り値を返したりすることはできません。

パーミッション

テンポラリ関数を作成するのでないかぎり、RESOURCE 権限が必要です。

Java 関数を含む外部関数には DBA 権限が必要です。

関連する動作

オートコミット。

参照
標準と互換性
  • SQL/2003   永続的ストアド・モジュール機能。

次の関数は、firstname 文字列と lastname 文字列を連結します。

CREATE FUNCTION fullname(
   firstname CHAR(30),
   lastname CHAR(30) )
RETURNS CHAR(61)
BEGIN
   DECLARE name CHAR(61);
   SET name = firstname || ' ' || lastname;
   RETURN (name);
END;

次の例は、最初の例で作成された fullname 関数を置き換えます。この関数が置き換えられると、ローカル変数 name が削除されます。

CREATE OR REPLACE FUNCTION fullname(
   firstname CHAR(30),
   lastname CHAR(30) )
RETURNS CHAR(61)
BEGIN
   RETURN = firstname || ' ' || lastname;
END;

次の例は、fullname 関数の使用法を示します。

2 つの提供された文字列からフル・ネームを戻します。

SELECT fullname ( 'joe', 'smith' );
fullname('joe','smith')
joe smith

全従業員の名前をリストします。

SELECT fullname ( GivenName, Surname )
FROM Employees;
fullname (GivenName, Surname)
Fran Whitney
Matthew Cobb
Philip Chin
Julie Jordan
...

次の文は、Transact-SQL 構文を使用します。

CREATE FUNCTION DoubleIt( @Input INT )
RETURNS INT
AS
BEGIN
  DECLARE @Result INT
  SELECT @Result = @Input * 2
  RETURN @Result
END;

SELECT DoubleIt( 5 ) は、10 の値を返します。