SAP HANA SQLスクリプトチュートリアル:構文と例
⚡ スマートサマリー
SQLスクリプト SAP HANAは、標準SQLに関数型および手続き型の構造を追加することで拡張します。ストアドプロシージャとユーザー定義関数をサポートし、データ集約型のロジックをアプリケーションサーバーからデータベースに移行します。

SQLスクリプトとは何ですか?
SQL スクリプトは、SQL の拡張機能のコレクションです。 単純な SQL の代わりにストアド プロシージャで使用できます。 それは機能的および手続き的な拡張を決定します。
In SQL スクリプト ユーザーは、主にストアド プロシージャの作成に使用される構造とテーブルのローカル変数を定義できます。
SQL スクリプトは計算ビューでも使用できます。 SQL Script には、XNUMX つの異なるロジック コンテナがあります。
- プロシージャ (プロシージャを使用すると、入力およびデータベース テーブルとして渡されたデータに対する一連のデータ変換を記述できます)。
- ユーザー定義関数 (ユーザー定義関数コンテナは、スカラー ユーザー定義関数とテーブル ユーザー定義関数に分かれています)。
SQL スクリプト言語の要素は次のとおりです –
宣言型SQLスクリプトロジック(機能拡張)
- これにより、データベース テーブルを参照せずにテーブル タイプを定義できます。
- SELECT などの典型的なステートメント。
- 計算エンジン (CE) 機能。
⚠️ バージョンに関する注記: 計算エンジンのプラン演算子、CE_COLUMN_TABLEやCE_JOINなどのCE_関数は、 SAP新規開発では、オプティマイザが少なくとも同等以上の性能で処理できる標準SQL文を使用する必要があります。既存のCEコードは引き続き動作しますが、プロシージャが次に変更される際には移行する必要があります。
オーケストレーション SQL スクリプト ロジック (機能拡張)
オーケストレーション ロジックは、DDL、DML、SQL クエリ ステートメントを使用してデータ フローを実装し、ループや条件などの命令型言語構造を使用してフロー ロジックを制御するために使用されます。
- データ定義言語ステートメント。 たとえば、スキーマを作成します。
- データ操作言語 (挿入など)。
命令型 SQL スクリプト ロジック (手続き型拡張)
命令型ロジックでは、ロジックが複数のデータ フローに分割されます。 例: IF、ELSEIF、ELSE、CASE、FOR (ループ)、例外。
SQLスクリプトの重要性
データ集約型のロジックやアプリケーション サーバーの操作をデータベース サーバーに移行するために必要な要素を提供するのは、SQL スクリプトだけです。
SQLスクリプトのポイント
- SQL スクリプトは、HANA データベース内の計算エンジンで実行および処理されます。
- SQL スクリプトは複雑な計算を実行できます。
- SQL スクリプトでは、中間結果を保持するローカル変数を宣言できます。
- SQL スクリプト プロシージャは「OUTPUT パラメータ」を使用することでより多くの結果を返すことができますが、通常の SQL プロシージャは XNUMX つの結果しか返せません。
- SQL スクリプトでは、パラメータとして使用できるグローバル テーブル タイプまたはローカル テーブル タイプを定義できます。
SQL Script を使用すると、並列処理モードを実現できます。
SQLスクリプトプロシージャの例
プロシージャは最も一般的なコンテナです。以下の例では、従業員データを読み込み、フィルタリングし、出力テーブルパラメータを通して結果を返します。
CREATE PROCEDURE DHK_SCHEMA.GET_HIGH_EARNERS ( IN im_min_salary DECIMAL(15,2), OUT ex_employees TABLE (EMP_NAME NVARCHAR(100), SALARY DECIMAL(15,2)), OUT ex_row_count INTEGER ) LANGUAGE SQLSCRIPT READS SQL DATA AS BEGIN -- Declarative logic: a table variable, not a physical table lt_all = SELECT EMP_NAME, SALARY FROM DHK_SCHEMA.EMPLOYEE WHERE SALARY >= :im_min_salary; -- Imperative logic: branch on the result SELECT COUNT(*) INTO ex_row_count FROM :lt_all; IF :ex_row_count = 0 THEN ex_employees = SELECT '' AS EMP_NAME, 0 AS SALARY FROM DUMMY WHERE 1 = 0; ELSE ex_employees = SELECT * FROM :lt_all ORDER BY SALARY DESC; END IF; END;
注目すべき慣例が3つあります。変数の読み取りにはコロンが先頭に付きます。 :lt_all テーブル変数を読み取りながら lt_all 左側の はそれに代入します。READS SQL DATA は、プロシージャに副作用がないことをオプティマイザに伝え、より積極的な並列化を可能にします。また、複数の出力パラメータを返すプロシージャは、まさに通常の SQL に欠けている機能です。
それを説明するのは簡単だ。
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
スカラーおよびテーブルユーザー定義関数
プロシージャはアクションを実行するのに対し、関数は値を返し、クエリ内で使用できます。SQL Script には 2 つの形式があり、これらは互換性がありません。
| スカラーUDF | テーブルUDF | |
|---|---|---|
| 返品 | 単一の値 | 結果セット |
| で使われる | SELECTリスト、WHERE句、式 | FROM句は、テーブルのように |
| データを変更できる | いいえ | いいえ |
| 典型的な使用 | 税率などの再利用可能な計算 | パラメータ化されたビューがフィルタリングされた行を返します |
-- Scalar function: returns one value CREATE FUNCTION DHK_SCHEMA.ADD_BONUS (im_salary DECIMAL(15,2)) RETURNS total DECIMAL(15,2) LANGUAGE SQLSCRIPT AS BEGIN total := :im_salary * 1.10; END; SELECT EMP_NAME, DHK_SCHEMA.ADD_BONUS(SALARY) AS WITH_BONUS FROM DHK_SCHEMA.EMPLOYEE;
テーブル関数は RETURNS TABLE で定義され、FROM 句でクエリされます。これにより、再利用可能なパラメータ化されたデータセットを構築する自然な方法となります。 計算ビュー またはレポートを消費することができます。
SQLスクリプトのベストプラクティス
SQLスクリプトは、エンジンが並列処理できるように記述するとパフォーマンスが向上しますが、アプリケーションコードのように記述するとパフォーマンスが低下します。その違いを生む6つの習慣があります。
- 命令形よりも宣言形を優先する。 単一のセットベースのステートメントは、行を1つずつ処理するループよりも、多くの場合、桁違いに優れたパフォーマンスを発揮します。FORループは、ロジックをセット操作として表現できない場合に限って使用してください。
- カーソルの使用は避けてください。 これらは行単位の処理を強制し、計算エンジンを完全に無効化します。ほぼすべてのカーソルは、結合または集計として書き換えることができます。
- 発言は独立したものにしてください。 互いに参照しない2つのテーブル変数は並列に計算されます。各ステップを前のステップに連結することで、手順全体が直列化されます。
- DECLARE READS SQL DATA where true. これは、その処置に副作用がないことを示しており、より最適化を可能にする。
- できるだけ早い段階で選別する。 最初のテーブル変数の行数を減らすと、後続の処理全体が縮小されますが、最後にフィルタリングを行うことで既にコストは発生しています。
- CE_関数から移行する。 これらは非推奨であり、1つのステートメント内でSQLと自由に混在させることはできません。また、SQLオプティマイザが同様の処理をより効率的に行うようになりました。
ステートメントレベルの構文については、 SAP HANASQL についてプロシージャ内で使用可能な関数 SAP HANA SQL関数、そしてこれらの手順を使用するモデリングオブジェクトは、 SAP HANAモデリング チュートリアル。
