適用対象:
Databricks SQL
Databricks Runtime 16.3 以降
例外ハンドラー、アクティブトランザクション状態、または最新の DML ステートメントの影響を受ける行数で処理された条件に関する情報を取得します。
CONDITIONフォームは、複合ステートメントの条件ハンドラー内でのみ使用できます。
TRANSACTION_ACTIVE形式は、スタンドアロン SQL ステートメントとして、または複合ステートメント内で使用できます。
ROW_COUNT形式は、SQL ストアド プロシージャの本体を含む複合ステートメント内でのみ使用できます。
構文
GET DIAGNOSTICS CONDITION 1
{ variable_name = condition_info_item } [, ...]
GET DIAGNOSTICS
{ variable_name = statement_info_item } [, ...]
condition_info_item
{ MESSAGE_TEXT |
RETURNED_SQLSTATE |
MESSAGE_ARGUMENTS |
CONDITION_IDENTIFIER |
LINE_NUMBER }
statement_info_item
{ TRANSACTION_ACTIVE |
ROW_COUNT }
パラメーター
-
ローカル変数またはセッション変数。
CONDITION条件ハンドラーをトリガーした条件を返します。 ハンドラーの最初のステートメントとして
GET DIAGNOSTICS CONDITION 1を発行する必要があります。MESSAGE_TEXT条件に関連付けられたメッセージ テキストを
STRINGとして返します。variable_nameはSTRINGである必要があります。RETURNED_SQLSTATESQLSTATEとして処理される条件に関連付けられているSTRINGを返します。variable_nameはSTRINGである必要があります。MESSAGE_ARGUMENTSDatabricks 条件のパラメーターへの引数として指定された
MAP<STRING, STRING>マッピングを返します。 宣言された条件の場合、マップ キーはMESSAGE_TEXTのみです。variable_nameはMAP<STRING, STRING>でなければなりませんCONDITION_IDENTIFIER例外の原因となった条件名を返します。
variable_nameはSTRINGである必要があります。LINE_NUMBER条件を発生させるステートメントの行番号を返します。
NULLが使用できない場合
TRANSACTION_ACTIVE適用対象:
Databricks SQL
Databricks Runtime 18.2 以降" とマークされているチェックステートメントがアトミック複合ステートメント (
BEGIN ATOMIC ... END) 内で実行されるときに1を返します。それ以外の場合は、0を返します。variable_nameはINTである必要があります。アトミック複合ステートメントは、 対話型トランザクションと同じマルチステートメント トランザクション セマンティクスを提供します。周囲のスコープについては、
BEGIN ATOMICを参照してください。ROW_COUNT適用対象:
Databricks SQL
Databricks Runtime 18.3 以降" とマークされているチェック最近実行された DML ステートメントの影響を受ける行数を
BIGINTとして返します。variable_nameはBIGINTである必要があります。次の場合に
NULLを返します。- 外側の複合体ではまだステートメントが実行されていません。
- 最新のステートメントは DML ステートメントではありません (たとえば、
SELECT、 DDL、SET VAR)。 - 最新の DML ステートメントでは、影響を受ける行数は報告されません。 組み込みの Delta Lake 書き込み (
INSERT、UPDATE、DELETE、MERGE INTO、およびCOPY INTO) は、ROW_COUNTを設定します。 Delta 以外のテーブルへの書き込みと Apache Spark データ ソース V2 カタログを介した書き込みでは、NULLが返されます。 - ハンドラーが入力されます。 各ステートメントは実行前に
ROW_COUNTをリセットするため、例外ハンドラーは常にNULLを監視します。 -
CALLステートメントが返されます。 プロシージャから戻すと呼び出し元のROW_COUNTがリセットされるため、呼び出し元は呼び出し先内で実行された DML を観察できません。
GET DIAGNOSTICSステートメントごとに最大 1 つの変数をROW_COUNTから割り当てることができます。 同じステートメントに割り当てを追加して、TRANSACTION_ACTIVEと組み合わせます。影響を受ける行数をキャプチャするには、DML ステートメントの直後に
GET DIAGNOSTICS ... = ROW_COUNTを配置します。 入れ子になったBEGIN ... ENDブロックは外部ブロックの DML を非表示にしません (値は入れ子になった複合本体全体で表示されたままです)。ただし、DML 以外のステートメントまたはCALLが介在している場合は、スロットがクリアされます。
例示
-- Capture details of a handled condition in an exception handler.
> CREATE OR REPLACE TABLE emp(name STRING, salary DECIMAL(10, 2));
> BEGIN
DECLARE EXIT HANDLER FOR DIVIDE_BY_ZERO
BEGIN
DECLARE cond STRING;
DECLARE message STRING;
DECLARE state STRING;
DECLARE args MAP<STRING, STRING>;
DECLARE line BIGINT;
DECLARE argstr STRING;
DECLARE log STRING;
GET DIAGNOSTICS CONDITION 1
cond = CONDITION_IDENTIFIER,
message = MESSAGE_TEXT,
state = RETURNED_SQLSTATE,
args = MESSAGE_ARGUMENTS,
line = LINE_NUMBER;
SET argstr = array_join(transform(map_entries(args), t -> concat_ws(' ', 'Param:', t.key, 'Val:', t.value)), ' ');
SET log = 'Condition: ' || cond ||
' Message: ' || message ||
' SQLSTATE: ' || state ||
' Args: ' || argstr ||
' Line: ' || line;
VALUES (log);
END;
SELECT 10/0;
END;
Condition: DIVIDE_BY_ZERO Message: Division by zero. Use try_divide to tolerate divisor being 0 and return NULL instead. If necessary, set <config> to “false” to bypass this error. SQLATTE: 22012 Args: Parm: config Val: ANSI_MODE Line: 28
-- Check whether the current statement runs inside an atomic transaction.
> DECLARE VARIABLE tx INT;
> GET DIAGNOSTICS tx = TRANSACTION_ACTIVE;
> SELECT tx;
0
> BEGIN ATOMIC
DECLARE tx INT;
GET DIAGNOSTICS tx = TRANSACTION_ACTIVE;
SELECT tx;
END;
1
-- Capture the number of rows affected by the most recent DML statement.
> CREATE OR REPLACE TABLE emp(name STRING, salary DECIMAL(10, 2));
> BEGIN
DECLARE rc BIGINT;
INSERT INTO emp VALUES ('Alice', 100.00), ('Bob', 200.00), ('Carol', 300.00);
GET DIAGNOSTICS rc = ROW_COUNT;
VALUES ('Inserted ' || rc || ' rows.');
DELETE FROM emp WHERE salary >= 200.00;
GET DIAGNOSTICS rc = ROW_COUNT;
VALUES ('Deleted ' || rc || ' rows.');
END;
Inserted 3 rows.
Deleted 2 rows.