適用対象:
Databricks SQL
Databricks Runtime 16.3 以降
SQL/PSM 標準ベースのスクリプト構文を使用して、強力な手続き型ロジックを使用できます。
すべての SQL スクリプトは、 複合ステートメント ブロック (BEGIN ... END) で構成され、開始されます。
複合ステートメントは、ローカル変数、カーソル、ユーザー定義条件、および例外をキャッチするために使用される条件ハンドラーを宣言するセクションで始まります。
その後に、次の複合ステートメント本体が続きます。
- フロー制御ステートメントには、述語式に対するループ、クエリ結果に対する FOR ループ、 IF や CASE などの条件付きロジック、 LEAVE や ITERATE などのループを分割する手段が含まれます。
- OPEN、FETCH、および CLOSE ステートメントを使用したカーソル処理 (Databricks Runtime 18.1 以降)。
-
ALTER、CREATE、DROPなどの DDL ステートメント。 - GRANTやREVOKEなどの DCL (データ制御) ステートメント。
- DML ステートメント INSERT、 UPDATE、 DELETE、 MERGE です。
- スクリプトの呼び出し側に結果セットを返すクエリ。
- SET ステートメントを使用して、ローカル変数とセッション変数を設定します。
- EXECUTE IMMEDIATE ステートメント。
- 入れ子になった複合ステートメント。変数、カーソル、条件、および条件ハンドラーの入れ子になったスコープを提供します。
呼び出し側と複合ステートメントの間でデータを渡す
SQL スクリプトとの間でデータを渡すには、次の 2 つの方法があります。
- セッション変数を使用して、スカラー値または配列またはマップの小さなセットを 1 つの SQL スクリプトから別の SQL スクリプトに渡します。
- パラメーター マーカーを使用して、スカラー値または配列の小さなセットを渡すか、ノートブック ウィジェット、Python、または別の言語から SQL スクリプトにデータをマップします。
変数とカーソルのスコープ
複合ステートメント内で宣言された変数は、複合ステートメント内の任意の式で参照できます。 Databricks は、名前解決で説明されている規則に従って、最も内側のスコープから外側に識別子を 解決します。 省略可能な複合ステートメント ラベル を使用して、重複する 変数名のあいまいさを解消できます。
複合ステートメント内で宣言されたカーソルは、その複合ステートメント内の OPEN、 FETCH、および CLOSE ステートメントで参照できます。 変数と同様に、オプションの複合ステートメント ラベルを使用して、入れ子になったスコープ内の重複するカーソル名を明確にすることができます。
条件処理
SQL スクリプトでは、複合ステートメントまたはCONTINUE実行 (Databricks Runtime 18.1 以降) をEXITする例外をインターセプトして処理するために使用される条件ハンドラーがサポートされています。
条件ハンドラー内では、元の例外を RESIGNAL したり、新しい例外を 通知 したり、例外なしで複合ステートメントを終了したりできます。
条件ハンドラーは、3 つの異なる条件クラスを処理するように定義できます。
DIVIDE_BY_ZEROやユーザー宣言条件など、特定の Databricks 定義のエラー クラスにすることができる 1 つ以上の名前付き条件。 これらのハンドラーは、これらの特定の条件を処理します。Databricks またはユーザーの
SQLSTATEステートメントによって発生させることができる 1 つ以上のSIGNAL。 これらのハンドラーは、そのSQLSTATEに関連付けられている任意の条件を処理できます。ジェネリック
SQLEXCEPTIONハンドラーは、SQLEXCEPTIONに含まれるすべての条件 (SQLSTATEではなくXX***されていない任意の02***) をキャッチできます。NOT FOUNDハンドラーは、SQLSTATE クラス'02xxx'を使用してすべての条件をキャッチします。これには、カーソル結果セットの末尾 (Databricks Runtime 18.1 以降) を超えてフェッチするときに発生するCURSOR_NO_MORE_ROWS条件が含まれます。
例外に適用される条件ハンドラーを決定するには、次を使用します。 この条件ハンドラーは、 最も適切なハンドラーと呼ばれます。
条件ハンドラーは、独自の本体または同じ複合ステートメントで宣言された条件ハンドラーの本体で定義されているステートメントには適用できません。
例外が発生した最も内側の複合ステートメントで定義されている適用可能な条件ハンドラーが適切です。
複数の適切なハンドラーが使用可能な場合は、最も具体的なハンドラーが最も適切です。 たとえば、名前付き条件のハンドラーは、名前付き
SQLSTATEのハンドラーよりも具体的です。 ジェネリックEXCEPTIONハンドラーは、最も具体性が低いハンドラーです。
条件ハンドラーの結果は次のとおりです。
-
EXITハンドラーはそのステートメントを実行し、ハンドラーを宣言した複合ステートメントを終了します。 その複合ステートメント内で開かれたすべてのカーソルと入れ子になった複合ステートメントは暗黙的に閉じられます。 -
CONTINUEハンドラーはそのステートメントを実行し、条件を発生させたステートメントの後に続くステートメントで実行を続行します。 - ハンドラーが独自の条件を
SIGNALまたはRESIGNALしない限り、条件ハンドラーの結果は、次に実行するハンドラーを宣言した複合ステートメントの後にステートメントを実行することです。
SQL ストアド プロシージャ
重要
この機能は パブリック プレビュー段階です。
適用対象:
Databricks SQL
Databricks Runtime 17.0 以降
CREATE PROCEDURE ステートメントを使用すると、Unity カタログに SQL スクリプトを保持できます。 その後、プロシージャへのアクセスを他のプリンシパルに GRANT することができます。 これらのプリンシパルは、 CALL ステートメントを使用してプロシージャを呼び出すことができます。
制御フロー ステートメントの一覧
サポートされている制御フロー ステートメントの一覧を次に示します。
- CASE ステートメント
- CLOSE ステートメント
- BEGIN END 複合ステートメント
- FETCH ステートメント
- FOR ステートメント
- GET DIAGNOSTICS ステートメント
- IF THEN ELSE ステートメント
- ITERATE ステートメント
- LEAVE ステートメント
- LOOP ステートメント
- OPEN ステートメント
- REPEAT ステートメント
- RESIGNAL ステートメント
- SIGNAL ステートメント
- WHILE ステートメント
Cursor ステートメントの一覧
Databricks Runtime 18.1 以降では、次のカーソル ステートメントがサポートされています。 カーソルは 複合ステートメントで宣言されます。