SAP HANA SQLスクリプトチュートリアル:構文と例

⚡ スマートサマリー

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

  • 🧩 コア定義: ストアドプロシージャ内で、通常のSQL文の代わりに用いられるSQL拡張機能の集合。
  • 📦 容器2個: 手続きは一連の変換を記述するものであり、ユーザー定義関数はスカラー形式とテーブル形式で提供される。
  • 🧠 宣言的論理: データベーステーブルを参照せずにテーブル型を定義し、通常のSELECT文を発行します。
  • 🎼 オーケストレーションロジック: DDL、DML、クエリ文、ループ、条件分岐を用いてデータフローを実装します。
  • 🔀 命令型論理: IF、ELSEIF、ELSE、CASE、FORループ、および例外処理は、データフロー全体にロジックを分割します。
  • 📤 複数の出力: SQLスクリプトプロシージャは、通常のSQLプロシージャとは異なり、OUTPUTパラメータを通じて複数の結果を返します。
  • ⚡ 並列実行: 独立したステートメントは、計算エンジンによって並列に実行されます。

SQLスクリプト SAP HANA

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. 命令形よりも宣言形を優先する。 単一のセットベースのステートメントは、行を1つずつ処理するループよりも、多くの場合、桁違いに優れたパフォーマンスを発揮します。FORループは、ロジックをセット操作として表現できない場合に限って使用してください。
  2. カーソルの使用は避けてください。 これらは行単位の処理を強制し、計算エンジンを完全に無効化します。ほぼすべてのカーソルは、結合または集計として書き換えることができます。
  3. 発言は独立したものにしてください。 互いに参照しない2つのテーブル変数は並列に計算されます。各ステップを前のステップに連結することで、手順全体が直列化されます。
  4. DECLARE READS SQL DATA where true. これは、その処置に副作用がないことを示しており、より最適化を可能にする。
  5. できるだけ早い段階で選別する。 最初のテーブル変数の行数を減らすと、後続の処理全体が縮小されますが、最後にフィルタリングを行うことで既にコストは発生しています。
  6. CE_関数から移行する。 これらは非推奨であり、1つのステートメント内でSQLと自由に混在させることはできません。また、SQLオプティマイザが同様の処理をより効率的に行うようになりました。

ステートメントレベルの構文については、 SAP HANASQL についてプロシージャ内で使用可能な関数 SAP HANA SQL関数、そしてこれらの手順を使用するモデリングオブジェクトは、 SAP HANAモデリング チュートリアル。

よくあるご質問

コロンは変数の読み取りを示します。左側にコロンを付けずに記述すると、その変数に値が代入されます。このように、2つの形式によって、パーサーは代入と参照を区別することができます。

いいえ。計算エンジンのプラン演算子は非推奨です。既存のコードは引き続き動作しますが、新規開発では標準SQLを使用してください。オプティマイザは現在、標準SQLを少なくとも同等以上の精度で処理できます。

多くの場合、そうです。多くのFORループやカーソルは、長い記述方法で結合や集計を表していますが、AIはセットベースの同等の表現を提案できます。採用する前に、行数が一致することを確認してください。

はい。計画書を読むViz tracつまり、AIは時間を消費しているステートメントを特定し、テーブル変数間の不要な依存関係によってステップが直列化されているかどうかを識別します。

はい、複数の出力テーブルパラメータを介して可能です。これは、単一の結果しか返せない通常のSQLプロシージャと比較して、SQLスクリプトの主な利点の1つです。