式とは、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 はトレリスロジックに従います。AND と OR は二項演算子であり、NOT は単項演算子です。
OceanBaseデータベースのPL演算子には、一般演算子、比較演算子、論理演算子が含まれます。
次の表は、論理演算子とその意味を説明しています。
| 演算子 | 意味 |
|---|---|
| IS NULL | NULL値かどうかを判断します |
| AND | 論理積 |
| OR | 論理和 |
| NOT | 反転。例えば IS NOT NULL、NOT IN |
論理演算子の戻り値の論理は以下のとおりです:
ANDは、両方のオペランドがTRUEの場合にのみTRUEを返します。いずれか一方のオペランドが
TRUEの場合、ORはTRUEを返します。オペランドが
NULLでない限り、NOTはそのオペランドと反対の値を返します。NULLは不確定な値であるため、NOT NULLはNULLを返します。
ショートカット評価
論理式を計算する際、PLはショートカット評価を使用します。つまり、結果が決定した時点でPLは式の評価を直ちに停止できます。
以下の例のように、ショートカット評価により OR 式でゼロ除算エラーが発生するのを防ぐことができます。a の値がゼロの場合、左側のオペランドの値は 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を返します。文字比較
デフォルトでは、ある文字のバイナリ値が大きい場合、その文字は他の文字よりも大きいと言えます。
日付比較
より新しい日付は、他の日付よりも大きいと言えます。
LIKE 演算子
LIKE 演算子は、文字、文字列、または CLOB 値をパターンと比較し、値がパターンと一致する場合は TRUE を返し、そうでない場合は FALSE を返します。
このパターンには、ワイルドカードであるアンダースコア(_)とパーセント記号(%)を含めることができます。アンダースコアはちょうど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 値が 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_value と selector がマッチする最初の result を返します。残りの式は計算されません。selector_value が selector とマッチしない場合、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 静的式は次のとおりです:
最大サイズが32,767バイトの文字列文字。
NULL値。
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ユニットの条件付きコンパイルステートメントで constant_name を BOOLEAN 式として使用する場合、PLユニットはプログラムパッケージ package_name に依存します。プログラムパッケージヘッダーを変更すると、従属するPLユニットが無効になり、再コンパイルが必要になる可能性があります。
複数のPLユニットの条件付きコンパイルを制御するために、静的定数を含むプログラムパッケージを使用する場合は、プログラムパッケージヘッダーを作成し、条件付きコンパイルの制御専用に使用することを推奨します。これにより、プログラムパッケージヘッダーの変更によるプログラムパッケージの無効化を回避できます。