データベースにユーザー定義 SQL 関数を作成します。
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 ...
パラメーター名は、データベース識別子に対するルールに従って付けてください。パラメーター名は、有効な SQL データ型にします。また、キーワード IN のプレフィクスを付けて、引数が関数に値を提供する式であることを示してください。ただし、関数パラメーターはデフォルトで IN です。
関数を実行するときに、すべてのパラメーターを指定する必要はありません。CREATE FUNCTION 文の中に DEFAULT 値がある場合、不明のパラメーターにデフォルト値を割り当てます。呼び出すときに引数を指定せず、デフォルトも設定されていない場合には、エラーが発生します。
OR REPLACE 句 CREATE OR REPLACE FUNCTION を指定すると、新しい関数が作成されるか、同じ名前の既存の関数が置き換えられます。関数が置き換えられた場合、関数の定義は変更されますが、既存のパーミッションは保持されます。
OR REPLACE 句をテンポラリ関数で使用することはできません。
TEMPORARY キーワード CREATE TEMPORARY FUNCTION を指定すると、作成した接続でのみ参照できる関数になり、接続を削除すると関数も自動的に削除されます。テンポラリ関数を明示的に削除することもできます。テンポラリ関数に対して ALTER、GRANT、または REVOKE は実行できません。また他の関数とは異なり、テンポラリ関数はカタログやトランザクションログに記録されていません。
テンポラリ関数は、作成者 (現在のユーザー) または指定された所有者のパーミッションで実行されます。テンポラリ関数に所有者を指定できるのは次の場合です。
テンポラリ関数が永続的なストアドプロシージャー内に作成された場合
テンポラリ関数と永続的なストアドプロシージャーとで所有者が同じ場合
テンポラリ関数の所有者を削除するには、テンポラリ関数を先に削除する必要があります。
読み込み専用のデータベースに接続するときに、テンポラリ関数の作成と削除を行うことができます。
OR REPLACE 句をテンポラリ関数で使用することはできません。
RETURNS 句 RETURNS 句は、関数の結果のデータ型を指定するときに使用します。
SQL SECURITY 句 SQL SECURITY 句は、INVOKER (関数を呼び出すユーザー) または DEFINER (関数を所有するユーザー) として関数が実行されるかどうかを定義します。デフォルトは DEFINER です。
[ 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 として宣言できます。
compound-statement BEGIN と END で囲まれ、セミコロンで区切られた SQL 文のセット。
tsql-compound-statement Transact-SQL 文のバッチ。
CREATE FUNCTION 文はデータベースに関数を作成します。所有者名を指定すれば、別のユーザーに対する関数を作成できます。パーミッションによる制御はありますが、関数は他の非集合関数とまったく同様に使用できます。
SQL SECURITY INVOKER が指定されている場合は、プロシージャーを呼び出すユーザーごとに注釈を行う必要があるためメモリ使用量が増えます。また、SQL SECURITY INVOKER が指定されている場合は、呼び出し側としても名前の決定が行われます。このため、すべてのオブジェクト名 (テーブル、プロシージャーなど) を該当する所有者で修飾する場合は注意が必要です。
NOT DETERMINISTIC と宣言されないかぎり、すべての関数は決定的として扱われます。決定的関数は、同じパラメーターに対して一貫した結果を返し、副次効果はありません。つまり、データベースサーバーは、同じパラメーターを持つ同じ関数が連続して 2 回呼び出されている場合は、どちらの呼び出しでも同じ結果が返され、クエリのセマンティックに不要な弊害は生じないものと見なします。
関数が結果セットを返す場合、出力パラメーターを設定したり戻り値を返したりすることはできません。
テンポラリ関数を作成するのでないかぎり、RESOURCE 権限が必要です。
Java 関数を含む外部関数には DBA 権限が必要です。
オートコミット、テンポラリ関数にも適用。
SQL/2008 CREATE FUNCTION は SQL/2008 標準のコア機能ですが、SQL Anywhere でサポートされている一部のコンポーネントはオプションの SQL 言語機能です。これらの機能のサブセットを次に示します。
SQL SECURITY 句は、オプションの言語機能 T324 です。
SQL 関数に LONG VARCHAR、LONG NVARCHAR、または LONG BINARY の値を渡す機能は、言語機能 T041 です。
CREATE TABLE または DROP TRIGGER などの文を使用して SQL 関数内でスキーマオブジェクトを作成または変更する機能は、言語機能 T651 です。
EXECUTE IMMEDIATE、PREPARE、および DESCRIBE などの文を使用して SQL 関数内で動的 SQL 文を使用する機能は、言語機能 T652 です。
CREATE FUNCTION 文のいくつかの句は、ベンダー拡張です。これらを以下に示します。
TEMPORARY 句。
ON EXCEPTION RESUME 句。
特定のルーチンパラメーター用のオプションの DEFAULT 句。
AS 句を使用した Transact-SQL 関数の指定。
オプションの OR REPLACE 句。
Transact-SQL CREATE FUNCTION は、Adaptive Server Enterprise でサポートされています。Adaptive Server Enterprise では、関数パラメーターにオプションの IN キーワードはサポートされていません。
次の関数は、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
の値を返します。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |