適用対象:
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 スクリプトでは、複合ステートメントまたはEXIT実行 (Databricks Runtime 18.1 以降) をCONTINUEする例外をインターセプトして処理するために使用される条件ハンドラーがサポートされています。
条件ハンドラー内では、元の例外を 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 以降では、次のカーソル ステートメントがサポートされています。 カーソルは 複合ステートメントで宣言されます。