OceanBaseデータベースに組み込まれている関数は、SQL文で直接使用できます。各関数の引数に渡される値には期待されるデータ型があります。渡されたデータ型が期待されるデータ型と異なる場合、OceanBaseデータベースは実際にSQL関数を実行する前に、引数として渡された値を期待されるデータ型に変換しようとします。
関数は演算子と似ており、いくつかのデータ要素を引数として入力し、結果を返します。しかし、関数は引数の形式において演算子とは大きく異なります。関数は含めることができる引数の数に制限がなく、一つの関数には1つから2つ、あるいはそれ以上の引数を持つことができます。
関数名(引数, 引数, ...)
関数は引数を持たない場合もあり、これは擬似列に似ています。ただし、擬似列は通常結果セットの各行に対して異なる値を返しますが、変数を持たない関数は通常各行に対して同じ値を返します。
注意
SQL文で LOB 列に関数を使用する場合、OceanBaseデータベースはSQLおよびPL処理中に一時的な LOB 列を作成し、一定の使用制限があります。詳細については、Oracleとの互換性比較 を参照してください。
この章では、関数を2つの主要なカテゴリに分類しています。各カテゴリの関数の引数と最終的な関数の戻り値には、それぞれ特定のデータ型があります:
単行関数:数値関数、文字列を返す文字列関数、数値を返す文字列関数、日付時刻関数、汎用的な比較関数、変換関数、エンコード・デコード関数、NULL値関連関数、環境および識別関数、階層関数などが含まれます。
集計関数:集約関数と分析関数が含まれます。
単行関数は、クエリ対象のテーブルまたはビューの各行に対して結果値を返します。これらの関数は、SQL文の SELECT、WHERE、START WITH、CONNECT BY、HAVING などの句で使用できます。
分析関数と集約関数は、いずれも行セットグループ(一連の行の集合)に対して集約計算を行います。違いは、集約関数は各グループから1つの値(1行)しか返せないのに対し、分析関数は各グループから複数の値(複数行)を返せる点です。行セットグループはウィンドウ(Window)とも呼ばれます。集約関数は通常、SELECT ステートメントの GROUP BY 句と一緒に使用されます。使用時には、データベースはクエリ対象のテーブルまたはビューの行をいくつかのグループに分割し、集約関数を各グループの行に適用すると同時に、各グループに対して1つの結果行を返します。
分析関数を使用する際には、特殊なキーワード OVER を使用してウィンドウを指定する必要があります。ウィンドウ関数の詳細については、分析関数の説明 を参照してください。
数値関数
数値関数の変数入力と関数出力結果はいずれも数値型であり、ほとんどの数値関数の戻り値のデータ型はNUMBERで、小数点以下38桁まで正確に表現できます。一部の高等代数学関連関数COS()、COSH()、EXP()、LN()、LOG()、SIN()、SINH()、SQRT()、TAN()、TANH()などの関数の結果は小数点以下36桁まで正確です。その他の代数学関連関数ACOS()、ASIN()、ATAN()およびATAN2()の結果は小数点以下30桁まで正確です。
文字列を返す文字列関数
関数の戻り値の最大長はデータ型の影響を受けます。例えば、関数の戻り値のデータ型がVARCHAR2である場合、実際のサイズがVARCHAR2データ型の最大制限を超えると、OceanBaseデータベースは結果を切り捨てて返しますが、クライアント側では警告されません。
注意
戻り値のデータ型がCLOBの場合、戻り値の長さが最大制限を超えると、OceanBaseデータベースはデータを返さず、エラーメッセージを表示します。
数値を返す文字列関数
数値を返す文字列関数は、指定された条件に基づいて数値を返します。例えば、ASCIIコード値や文字(文字列)の位置などです。
日付時刻関数
日付時刻関数がサポートする入力パラメータのデータ型には、日付時刻(DATE)、タイムスタンプ(TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE)、および間隔(INTERVAL DAY TO SECOND、INTERVAL YEAR TO MONTH)の3種類があります。
DATEデータ型のみを入力パラメータとしてサポートする関数には、ADD_MONTHS、CURRENT_DATE, LAST_DAY、NEXT_DAYが含まれます。
上記の関数に対してTIMESTAMP型のデータを指定しようとした場合、OceanBaseデータベースは内部で暗黙的なデータ型変換を行い、その後関数に渡して計算を実行し、DATE型の戻り値を返します。
日付時刻関数を使用する前に、現在のNLSフォーマットを確認するためにSELECT * FROM NLS_DATABASE_PARAMETERSを実行することを推奨します。例:
obclient> SELECT * FROM NLS_DATABASE_PARAMETERS;
+-------------------------+------------------------------+
| PARAMETER | VALUE |
+-------------------------+------------------------------+
| NLS_DATE_FORMAT | DD-MON-RR |
| NLS_TIMESTAMP_FORMAT | YYYY-MM-DD HH24:MI:SS |
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR |
| NLS_TERRITORY | AMERICA |
| NLS_SORT | BINARY |
| NLS_COMP | BINARY |
| NLS_CHARACTERSET | AL32UTF8 |
| NLS_NCHAR_CHARACTERSET | AL16UTF16 |
| NLS_DATE_LANGUAGE | AMERICAN |
| NLS_LENGTH_SEMANTICS | BYTE |
| NLS_NCHAR_CONV_EXCP | FALSE |
| NLS_CALENDAR | GREGORIAN |
| NLS_NUMERIC_CHARACTERS | ., |
+-------------------------+------------------------------+
13 rows in set
文中の例と表示形式が一致しない場合は、以下のコマンドを実行してフォーマットを変更できます。
obclient>ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
Query OK, 0 rows affected
obclient>ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
Query OK, 0 rows affected
/*戻り値の秒の小数部分を9桁に設定する*/
obclient> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF TZR TZD';
Query OK, 0 rows affected
注意
MONTHS_BETWEENの戻り値は1つの数字です。ROUNDとTRUNCは暗黙的な変換を行うことができず、DATE型の値を渡さないとエラーが発生します。
残りの関数は、3種類のパラメータデータ型すべてをサポートしており、出力と入力パラメータのデータ型が同じです。
比較関数
このカテゴリの関数を使用すると、集合内で最大値と最小値を迅速に見つけることができます。
変換関数
このタイプの関数を使用して、元のデータ型を別のデータ型に変換できます。
エンコード・デコード関数
このタイプの関数を使用して、OceanBaseデータベースでデータのエンコードおよびデコード要件を実現できます。
NULL値関連関数
NULL値関連関数は、パラメータ内のNULL値を処理するために使用されます。ほとんどの関数では、入力パラメータがNULL値NULLの場合、返される結果もNULLとなります。このような場合、NVL関数を使用して非NULL値を返すことができます。例えば、手数料を記録するテーブルの手数料列commission_pctがNULL値NULLの場合、式NVL(commission_pct, 0)は0を返します。commission_pctの値がNULL以外の場合、実際の手数料値を返します。
環境関連関数
環境関連関数は、主にセッションまたはテナントインスタンスに関連する環境情報を提供します。
階層関数
| 関数分類 | 関数サブカテゴリ | 関数名 | 機能の説明 |
|---|---|---|---|
| 単一関数 | 階層関数 | SYS_CONNECT_BY_PATH | ルートからノードへの列値のパスを返します。CONNECT BY条件で返される各行の列値は、指定された区切り文字で区切られます。 |
JSON関数
JSON関数は、JSON値の作成、操作、検索などの操作を行います。
XML関数
XML関数は、XMLドキュメントの効率的なクエリ、更新、検索を実行できます。
集計関数
集計関数は、一連の値に対して計算を実行し、単一の値を返します。集計関数はNULL値を無視します。集計関数は通常、SELECTステートメントのGROUP BY句と一緒に使用されます。
分析関数
分析関数(一部のデータベースではウィンドウ関数とも呼ばれる)は、集計関数と似ており、計算は常に一連の行に基づいていますが、集計関数は1組につき1行しか返せないのに対し、分析関数は1組につき複数行を返すことができ、グループ内の各行はウィンドウに基づく論理的な計算の結果です。分析関数は、Self-Joinを必要とするクエリを大幅に最適化できます。