ユーザ定義関数は、集合関数以外の組み込み関数が使われていればどこでも使用できますが、適切なパーミッションが必要です。
次に示す例は、姓と名前の入った 2 つのカラムから氏名を表示します。
SELECT FullName(GivenName, Surname) AS "Full Name" FROM Employees; |
Full Name |
---|
Fran Whitney |
Matthew Cobb |
Philip Chin |
... |
次の例は、文中に提供された姓と名前から氏名を表示します。
SELECT FullName('Jane', 'Smith') AS "Full Name"; |
Full Name |
---|
Jane Smith |
関数に対する EXECUTE パーミッションを付与されたユーザは FullName 関数を使用できます。
次にローカル変数の宣言の例としてユーザ定義関数を示します。
Customers テーブルには、カナダとアメリカの顧客が含まれます。ユーザ定義関数 Nationality は、Country カラムの入力データに基づいて 3 文字の国コードを生成します。
CREATE FUNCTION Nationality( CustomerID INT ) RETURNS CHAR( 3 ) BEGIN DECLARE nation_string CHAR(3); DECLARE nation country_t; SELECT DISTINCT Country INTO nation FROM Customers WHERE ID = CustomerID; IF nation = 'Canada' THEN SET nation_string = 'CDN'; ELSE IF nation = 'USA' OR nation = ' ' THEN SET nation_string = 'USA'; ELSE SET nation_string = 'OTH'; END IF; END IF; RETURN ( nation_string ); END; |
この例では国名を入れる変数 nation_string を宣言し、SET 文を使用して値を nation_string に入れます。次に nation_string の値を、この関数を呼び出した環境に返します。
次に示すクエリは、Customers テーブルに含まれるカナダの顧客をすべてリストします。
SELECT * FROM Customers WHERE Nationality(ID) = 'CDN'; |
カーソルと例外の宣言については後で説明します。
この関数は説明には役立ちますが、多数のローを含む SELECT に使用する場合は、性能が非常に低くなることがあります。たとえば、テーブルに 100,000 のローがあり、その中の 10,000 のローを返すようなクエリの SELECT リストで関数を使用した場合、関数は 10,000 回呼び出されます。同じクエリの WHERE 句に関数を使用した場合は、100,000 回呼び出されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |