式は、1つ以上の値、演算子、およびSQL評価関数の組み合わせです。式は常に単一の値を返します。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
複雑さに応じて、式は以下のタイプがあります:
単一の定数または変数(例:
c)。単一のオペランドを持つ一元演算子(例:
-c)。2つのオペランドを持つ二項演算(例:
a + b)。
オペランドは、変数、定数、文字列、演算子、関数呼び出し、プレースホルダー、または他の式です。オペランドのデータ型によって式のデータ型が決定されます。式を評価するたびに、そのデータ型の単一の値が生成されます。この結果のデータ型が式のデータ型となります。
結合演算子
結合演算子(||)は、2つの文字列を結合するために使用されます。
結合演算子はnullオペランドを無視します。
例:
obclient> DECLARE
a VARCHAR2(10) := 'Ocean';
b VARCHAR2(10) := 'Base';
BEGIN
DBMS_OUTPUT.PUT_LINE (a || NULL || NULL|| b);
END;
/
Query OK, 0 rows affected
OceanBase
演算子の優先順位
演算子は、単一のオペランドを取る単項演算子である場合も、2つのオペランドを取る二項演算子である場合もあります。式は演算子の優先順位に従って評価されます。
演算子に他の文字(スペース文字を含む)を埋め込まないでください。
次の表は、最も高い優先順位から最も低い優先順位までの演算子の優先順位を示しています。同じ優先順位を持つ演算子には、指定された評価順序はありません。
演算子 |
名前 |
|---|---|
| ** | 幂演算子 |
| +, - | 恒等・否定演算子 |
| *, / | 乗算・除算演算子 |
| +, -, || | 加算・減算・結合演算子 |
| =, <, >, <=, >=, <>, !=, ~=, ^=, IS NULL, LIKE, BETWEEN, IN | 比較演算子 |
| NOT | 反転演算子 |
| AND | 論理積 |
| OR | 論理和 |
括弧を使用して、式内の演算子の評価順序を制御できます。例:
obclient> DECLARE
x INTEGER := 1+2*3+2**2;
y INTEGER := (1+2*3+2)**2;
z INTEGER := ((1+2)*3+2)**2;
BEGIN
DBMS_OUTPUT.PUT_LINE('x = ' || x);
DBMS_OUTPUT.PUT_LINE('y = ' || y);
DBMS_OUTPUT.PUT_LINE('z = ' || z);
END;
/
Query OK, 0 rows affected
x = 11
y = 81
z = 121
論理演算子
論理演算子 AND、OR および NOT は3状態論理に従います。AND と OR は二項演算子であり、NOT は一項演算子です。
OceanBaseデータベースのPL演算子には、一般演算子、比較演算子、論理演算子が含まれます。
次の表は、論理演算子とその意味を説明したものです。
演算子 |
意味 |
|---|---|
| IS NULL | NULL値かどうかを判断します |
| AND | 論理積 |
| OR | 論理和 |
| NOT | 反転します。例:IS NOT NULL、NOT IN |
論理演算子の戻り値の論理は以下のとおりです:
ANDがTRUEを返すのは、両方の演算子がTRUEの場合のみです。いずれか一方の演算子が
TRUEの場合、ORはTRUEを返します。演算子が
NULLでない限り、NOTは演算子の反対の値を返します。NOT NULLはNULLを返します。これは、NULLが不定値だからです。
ショートサーキット評価
論理式を計算する際、PLはショートサーキット評価を使用します。つまり、結果が確定した時点で式の評価を即座に停止できるということです。
以下の例のように、ショートサーキット評価により、OR 式でゼロ除算エラーを防ぐことができます。a の値が0の場合、左側の演算子の値は TRUE となり、PLは右側の演算子を計算しません。もしPLが OR 演算子を適用する前に両方の演算子を計算してしまった場合、右側の演算子が原因でゼロ除算エラーが発生してしまいます。
obclient> DELIMITER $$ --式にスラッシュ(/)が含まれているため、区切り文字を再定義します
obclient> DECLARE
a INTEGER := 0;
b INTEGER := 20;
BEGIN
IF (a = 0) OR ((b / a) < 5) THEN --最初の式を実行した後、計算が停止し、ゼロ除算エラーは発生しません
DBMS_OUTPUT.PUT_LINE('The output is zero.');
END IF;
END;
$$
Query OK, 0 rows affected
The output is zero.
比較演算子
比較演算子は、ある式と別の式を比較します。結果は常に TRUE、FALSE、または NULL です。
いずれか一方の式の値が NULL の場合、比較結果も NULL になります。
PL でサポートされている比較演算子は次のテーブルのとおりです。
演算子 |
意味 |
|---|---|
| = | 等しい |
| <> , != , ~= , ^= | 等しくない |
| < | より小さい |
| > | より大きい |
| <= | 以下のいずれか |
| >= | 以上のいずれか |
| BETWEEN AND | ~と~の間にある |
| IN | ある集合に属する |
| IS <NOT> NULL | NULL値を判断する |
| LIKE | パターンマッチング |
IS [NOT] NULL 演算子
IS NULL 演算子の演算子数が NULL の場合、BOOLEAN 値 TRUE を返します。それ以外の場合は FALSE を返します。IS NOT NULL 演算子はその逆の動作をします。NULL 値を含む比較の結果は常に NULL です。
関係演算子
関係演算子には、算術比較、BOOLEAN 比較、文字比較、日付比較が含まれます。
算術比較
数字が大きい方が、もう一方より大きいと言えます。実数は近似値として格納されるため、等しいか不等しいかの比較を行うことを推奨します。
BOOLEAN比較定義上、
TRUEはFALSEより大きいです。NULLとの比較では、結果は常にNULLになります。文字比較
デフォルトでは、文字の2進数表現が大きい方が、もう一方の文字より大きいと言えます。
日付比較
日付が近い方が、もう一方の日付より大きいと言えます。
LIKE 演算子
LIKE 演算子は、文字、文字列、または CLOB 値をパターンと比較し、値がパターンに一致する場合は TRUE を返し、一致しない場合は FALSE を返します。
このパターンには、2つのワイルドカードであるアンダースコア(_)とパーセント記号(%)を含めることができます。アンダースコアは1文字に正確に一致します。パーセント記号(%)は0文字以上の任意の文字列に一致します。
パーセント記号やアンダースコアを検索するには、エスケープ文字を定義し、それをパーセント記号やアンダースコアの前に配置する必要があります。
例:
obclient> DECLARE
PROCEDURE compare (
name VARCHAR2,
customer VARCHAR2
) IS
BEGIN
IF name LIKE customer THEN
DBMS_OUTPUT.PUT_LINE ('TRUE');
ELSE
DBMS_OUTPUT.PUT_LINE ('FALSE');
END IF;
END;
BEGIN
compare('ZhangSan', 'Zhang%S_n');
compare('ZhangSan', 'zhang%s_n');
END;
/
Query OK, 0 rows affected
TRUE
FALSE
この例では、ZhangSan はパターン 'Zhang%S_n' に一致するため、TRUE を返します。'zhang%s_n' には一致しないため、FALSE を返します。
BETWEEN 演算子
BETWEEN 演算子は、値が指定された範囲内にあるかどうかをテストするために使用されます。
式 c BETWEEN a AND b の値は、式 (c>= a)AND(c<= b) の値と同じです。式 x の値は1回だけ計算されます。
例:
obclient> CREATE OR REPLACE PROCEDURE output_bool (
bool_name VARCHAR2,
bool_value BOOLEAN
) AUTHID DEFINER IS
BEGIN
IF bool_value IS NULL THEN
DBMS_OUTPUT.PUT_LINE (bool_name || ' = NULL');
ELSIF bool_value = TRUE THEN
DBMS_OUTPUT.PUT_LINE (bool_name || ' = TRUE');
ELSE
DBMS_OUTPUT.PUT_LINE (bool_name || ' = FALSE');
END IF;
END;
/
obclient>BEGIN
output_bool ('8 BETWEEN 7 AND 9', 8 BETWEEN 7 AND 9);
output_bool ('8 BETWEEN 7 AND 8', 8 BETWEEN 7 AND 8);
output_bool ('8 BETWEEN 5 AND 6', 8 BETWEEN 5 AND 6);
END;
/
Query OK, 0 rows affected
8 BETWEEN 7 AND 9 = TRUE
8 BETWEEN 7 AND 8 = TRUE
8 BETWEEN 5 AND 6 = FALSE
IN 演算子
IN 演算子は、メンバーシップの集合をテストするために使用されます。x IN(set) は、x が set のメンバーと等しい場合にのみ TRUE を返します。
例:
DECLARE
familyname VARCHAR2(10) := 'Zhang';
BEGIN
output_bool (
'familyname IN (''Zhao'', ''Qian'', ''Sun'', ''Li'')',
familyname IN ('Zhao', 'Qian', 'Sun', 'Li')
);
output_bool (
'familyname IN (''He'', ''Lv'', ''Shi'', ''Zhang'')',
familyname IN ('He', 'Lv', 'Shi', 'Zhang')
);
END;
/
Query OK, 0 rows affected
familyname IN ('Zhao', 'Qian', 'Sun', 'Li') = FALSE
familyname IN ('He', 'Lv', 'Shi', 'Zhang') = TRUE
BOOLEAN式
BOOLEAN 式とは、BOOLEAN 値として TRUE、FALSE、または NULL を返す式です。
最も単純な BOOLEAN 式は、BOOLEAN テキスト、定数、または変数です。
通常、BOOLEAN 式は制御文やDML文の WHERE 句における条件として使用されます。
BOOLEAN 変数自体を条件として使用でき、TRUE または FALSE 値と比較する必要はありません。
例:
DECLARE
a BOOLEAN := FALSE;
BEGIN
-- 以下の3つのWHILEループは等価です
WHILE a = FALSE
LOOP
a := TRUE;
END LOOP;
WHILE NOT (a = TRUE)
LOOP
a := TRUE;
END LOOP;
WHILE NOT a
LOOP
a := TRUE;
END LOOP;
END;
/
CASE式
単純CASE式
最もシンプルな CASE ステートメントは、単一の式の値を計算し、複数の可能な値と比較します。
構文は以下のとおりです:
CASE selector
WHEN selector_value_1 THEN result_1
WHEN selector_value_2 THEN result_2 ...
WHEN selector_value_n THEN result_n
[ ELSE
else_statements ]
END
CASE;
selector は式(通常は変数)です。各 selector_value と各 result は、テキストまたは式にすることができます。少なくとも1つの result は NULL にできません。
単純CASE式は、selector に一致する最初の result を返します。その後の式は評価されません。selector に一致する selector_value がない場合、CASE式は else_result(存在する場合)を返します。それもない場合は NULL を返します。
例:
obclient> DECLARE
grade CHAR(1);
BEGIN
grade := 'B';
CASE grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('PASS');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('SUSPEND');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('FAIL');
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
END CASE;
END;
/
Query OK, 0 rows affected
SUSPEND
検索CASE式
検索CASEステートメントでは、CASE の後に計算する式はなく、WHEN の後に複数のブール式が続きます。検索CASEは複数のブール式を評価し、最初に TRUE となる結果の分岐を選択します。
検索CASE式の構文は以下のとおりです:
CASE
WHEN boolean_expression_1 THEN result_1
WHEN boolean_expression_2 THEN result_2 ...
WHEN boolean_expression_n THEN result_n
[ ELSE
else_result ]
END CASE;
検索CASE宣言は、最初の result が TRUE となる boolean_expression を実行し、その後の他の boolean_expression は実行しません。すべての boolean_expression が TRUE でない場合、else_result(存在する場合)を返します。else_result が存在しない場合は NULL を返します。
単純CASE式に対応する検索CASE式の例:
obclient> DECLARE
grade CHAR(1);
BEGIN
grade := 'D';
CASE
WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('PASS');
WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('SUSPEND');
WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('FAIL');
ELSE DBMS_OUTPUT.PUT_LINE('UNEXPECTED');
END CASE;
END;
/
Query OK, 0 rows affected
UNEXPECTED
PL式におけるSQL関数
PL式では、すべてのSQL関数を使用できますが、以下のものは除きます:
集計関数(例:
AVGおよびCOUNT)分析関数(例:
LAGおよびRATIO_TO_REPORT)データマイニング関数(例:
CLUSTER_IDおよびFEATURE_VALUE)エンコード・デコード関数(例:
DECODEおよびDUMP)モデル関数(例:
ITERATION_NUMBERおよびPREVIOUS)オブジェクト参照関数(例:
REFおよびVALUE)XML関数(例:
APPENDCHILDXMLおよびEXISTSNODE)変換関数
BIN_TO_NUMJSON SQL演算子
JSON_ARRAYAGG、JSON_OBJAGG、JSON_TABLEおよびJSON_TEXTCONTAINSSQLソート演算子と関数
COLLATE、COLLATION、NLS_COLLATION_IDおよびNLS_COLLATION_NAMEその他の関数
CUBE_TABLE、DATAOBJ_TO_PARTITION、LNNVL、NVL2、SYS_CONNECT_BY_PATH、SYS_TYPEIDおよびWIDTH_BUCKET説明
上記の一部の関数は、OceanBaseデータベースの現在のバージョンではサポートされていません。
静的式
静的式とは、コンパイル時に値が確定する式のことです。つまり、文字列比較、変数、関数呼び出しを含みません。静的式は、条件付きコンパイル指示子に記述できる唯一の式です。
静的式の定義は以下のとおりです:
式が
NULLテキストの場合、その式は静的式です。式が文字、数字、またはブールテキストの場合、その式は静的式です。
式が静的定数への参照である場合、その式は静的式です。
式が
$$で始まる条件付きコンパイル変数への参照である場合、その式は静的式です。式が静的式でサポートされている演算子であり、すべてのオペランドが静的であり、かつその演算子がこれらのオペランドを評価する際に例外を発生させない場合、その式は静的式です。
静的式でサポートされている演算子は以下の表のとおりです。
演算子 |
カテゴリ |
|---|---|
| () | 式の区切り文字 |
| ** | 幂 |
| *, /,+, - | 算術演算子 乗算、除算、加算または正、減算または負 |
| =, !=, <, <=, >=, > IS [NOT] NULL | 比較演算子 |
| NOT | 論理演算子 |
| [NOT] LIKE, [NOT] LIKE2, [NOT] LIKE4, [NOT] LIKEC | パターンマッチング演算子 |
| XOR | 二項演算子 |
以下は静的式でサポートされている関数です。
ABS
ACOS
ASCII
ASCIISTR
ASIN
ATAN
ATAN2
BITAND
CEIL
CHR
COMPOSE
CONVERT
COS
COSH
DECOMPOSE
EXP
FLOOR
HEXTORAW
INSTR
INSTRB
INSTRC
INSTR2
INSTR4
IS [NOT] INFINITE
IS [NOT] NAN
LENGTH
LENGTH2
LENGTH4
LENGTHB
LENGTHC
LN
LOG
LOWER
LPAD
LTRIM
MOD
NVL
POWER
RAWTOHEX
REM
REMAINDER
REPLACE
ROUND
RPAD
RTRIM
SIGN
SIN
SINH
SQRT
SUBSTR
SUBSTR2
SUBSTR4
SUBSTRB
SUBSTRC
TAN
TANH
TO_BINARY_DOUBLE
TO_BINARY_FLOAT
TO_CHAR
TO_NUMBER
TRIM
TRUNC
UPPER
静的式は、以下のサブタイプ宣言に使用できます:
文字列型の長さ(
VARCHAR2、NCHAR、CHAR、NVARCHAR2、RAW、ANSI)NUMBER型とサブタイプ(例:FLOAT)の範囲と精度間隔型の精度(年、月、秒)
時刻とタイムスタンプの精度
VARRAYの上限型宣言における範囲の上限
各ケースにおいて、静的式の結果型は宣言項目のサブタイプと同じでなければならず、かつ文脈上の適切な範囲内でなければなりません。
PLS_INTEGER 静的式
PLS_INTEGER 静的式は以下のとおりです:
PLS_INTEGERテキストPLS_INTEGER静的定数NULL
BOOLEAN 静的式
BOOLEAN 静的式は以下のとおりです:
BOOLEANリテラル(TRUE、FALSE、またはNULL)BOOLEAN静的定数以下の式において、
xとyはPLS_INTEGER静的式です:- x > y
- x < y
- x >= y
- x <= y
- x = y
- x <> y
以下の式において、
xとyは BOOLEAN 式です:- NOT y
- x AND y
- x OR y
- x > y
- x >= y
- x = y
- x <= y
- x <> y
以下の式において、
xは静的式です:- x IS NULL
- x IS NOT NULL
VARCHAR2 静的式
VARCHAR2 静的式は以下のとおりです:
最大サイズが32767バイトの文字列テキスト。
空値。
TO_CHAR(x)、ここでxはPLS_INTEGER 静的式です。TO_CHAR(x, f, n)、ここでxはPLS_INTEGER静的式、fとnはVARCHAR2静的式です。x || y、ここでxとyはVARCHAR2またはPLS_INTEGER静的式です。
静的定数
パッケージ内で静的定数は以下の構文で宣言します:
constant_name CONSTANT data_type := static_expression;
ここで、static_expression の型は data_type と同じでなければなりません(BOOLEAN または PLS_INTEGER)。
package_name パッケージ本体でも、静的定数は常に package_name.constant_name として参照する必要があります。
PLユニットの条件付きコンパイル指示子で BOOLEAN 式に constant_name を使用する場合、PLユニットはパッケージ package_name に依存します。パッケージヘッダーを変更した場合、従属するPLユニットが無効になり、再コンパイルが必要になる可能性があります。
静的定数を含むパッケージを使用して複数のPLユニットの条件付きコンパイルを制御する場合、パッケージの無効化を避けるため、条件付きコンパイルの制御専用にパッケージヘッダーを作成することを推奨します。