ユーザー定義関数(UDF)とは、プログラムや環境のユーザーが独自に提供する関数であり、通常はプログラムや環境に組み込まれている関数を前提としています。UDFは通常、作成者の要件に基づいて作成されます。
BASICプログラミング言語の古い実装では、ユーザー定義関数は「DEF FN」構文を使用して定義されていました。より現代的なBASICの方言は構造化プログラミングのパラダイムの影響を受けており、コードの大部分またはすべてがユーザー定義関数またはプロシージャとして記述されるため、この概念は実質的に不要になっています。
COBOLプログラミング言語において、ユーザー定義関数とは、FUNCTION-ID段落を指定することでユーザーが定義するエンティティです。ユーザー定義関数は、プロシージャ部ヘッダーのRETURNING句を指定することで値を返す必要があり、関数識別子構文を使用して呼び出されます。詳細は、ISO/IEC 1989:2014 プログラミング言語 COBOL規格を参照してください。
2022年5月現在、IBM Enterprise COBOL for z/OS 6.4(IBM COBOL)コンパイラは、ユーザー定義関数をサポートしています。
リレーショナルデータベース管理システムにおいて、ユーザー定義関数は、標準クエリ言語(通常はSQL)ステートメントで評価可能な関数を追加することで、データベースサーバーの機能を拡張するメカニズムを提供します。SQL標準では、スカラー関数とテーブル関数が区別されています。スカラー関数は単一の値(またはNULL)のみを返しますが、テーブル関数は、0行以上の行と1つ以上の列を持つ(リレーショナル)テーブルを返します。
SQL のユーザー定義関数は、CREATE FUNCTIONステートメントを使用して宣言します。たとえば、摂氏を華氏(米国で使用されている温度単位)に変換するユーザー定義関数は、次のように宣言できます。
CREATE FUNCTION dbo.CtoF ( Celsius FLOAT ) RETURNS FLOAT RETURN ( Celsius * 1.8 ) + 32ユーザー定義関数は、作成後、 SQL文の式で使用できます。たとえば、他のほとんどの組み込み関数が使用できる場所で呼び出すことができます。これにはSELECT文も含まれ、データベースのテーブルに格納されているデータに対して関数を使用できます。概念的には、このような使用方法では、関数は行ごとに1回評価されます。たとえば、Elements既知の化学元素ごとに1行を持つテーブルがあるとします。このテーブルには、その元素の沸点(摂氏)を表すBoilingPointという列があります。クエリは次のようになります。
SELECT Name , CtoF (沸点) FROM Elements各行から名前と沸点を取得します。CtoFそして、上記で宣言したユーザー定義関数を呼び出して、列の値を華氏に変換します。
ユーザー定義関数はそれぞれ特定のプロパティまたは特性を持ちます。SQL標準では、以下のプロパティが定義されています。
ユーザー定義関数とストアドプロシージャを混同してはいけません。ストアドプロシージャを使用すると、ユーザーは一連のSQLコマンドをグループ化できます。プロシージャはパラメータを受け取り、そのパラメータに応じてSQLステートメントを実行します。プロシージャは式ではないため、ユーザー定義関数のように使用することはできません。
一部のデータベース管理システムでは、SQL以外の言語でユーザー定義関数を作成できます。例えば、Microsoft SQL Serverでは、C#を含む.NET言語をこの目的で使用できます。DB2とOracleは、C言語またはJava言語で記述されたユーザー定義関数をサポートしています。
Microsoft SQL Server 2000には、スカラー関数、インラインテーブル値関数、および複数ステートメントテーブル値関数の3種類のUDF(ユーザー定義関数)があります。
スカラー関数は、RETURNS句を使用して単一のデータ値(テーブルではない)を返します。スカラー関数は、タイムスタンプとユーザー定義データ型を除くすべてのスカラーデータ型を使用できます。インラインテーブル値関数は、単一のSELECT文の結果セットを返します。複数ステートメントテーブル値関数は、複数のTRANSACT-SQL文で構築されたテーブルを返します。
ユーザー定義関数は、OBJECT_ID、LEN、DATEDIFFなどの組み込み関数と同様にクエリから呼び出すことも、ストアドプロシージャのようにEXECUTEステートメントを介して実行することもできます。
演奏に関する注意事項:
CREATE FUNCTION MyFunction () RETURNS @Tbl TABLE ( StudentID VARCHAR ( 255 ), SAS_StudentInstancesID INT , Label VARCHAR ( 255 ), Value MONEY , CMN_PersonsID INT ) AS BEGIN INSERT @Tbl ( StudentID , SAS_StudentInstancesID , Label , Value , CMN_PersonsID ) SELECT StudentID , SAS_StudentInstancesID , Label , Value , CMN_PersonsID FROM MyView -- ここで、MyView は (結合を使用して) 大きなテーブルから同じ列を選択しますリターンエンドユーザー定義関数は、1 つ以上の Transact-SQL ステートメントで構成されるサブルーチンであり、再利用のためにコードをカプセル化するために使用できます。引数を 0 個以上受け取り、戻り値を評価します。ストアド プロシージャと同様に、本体には制御フロー ステートメントと DML ステートメントの両方が含まれます。データベースやファイル、ネットワークなどの外部リソースの変更など、グローバル セッション状態の変更は許可されません。出力パラメーターはサポートされていません。パラメーターのデフォルト値を渡すには、DEFAULT キーワードを指定する必要があります。UDF にエラーが発生すると、UDF が異常終了し、その結果、UDF を呼び出したステートメントも異常終了します。
CREATE FUNCTION CubicVolume -- 入力寸法(センチメートル) (@CubeLength decimal ( 4 , 1 ), @CubeWidth decimal ( 4 , 1 ), @CubeHeight decimal ( 4 , 1 ) )RETURNS decimal ( 12 , 3 ) AS BEGIN RETURN ( @CubeLength * @CubeWidth * @CubeHeight ) ENDApache Hive は、通常のユーザー定義関数 (UDF) に加えて、ユーザー定義集計関数 (UDAF) およびテーブル生成関数 (UDTF) も定義しています。[ 1 ] Hive を使用すると、開発者は Java で独自のカスタム関数を作成できます。[ 2 ]
オープンソースのリアルタイム分析データベースであるApache Dorisは、外部ユーザーがC++で記述した独自のUDFを貢献することを可能にしている。[ 3 ]