ストアドプロシージャ SAP HANA(SQLチュートリアル)

⚡ スマートサマリー

SAP HANA SQLストアドプロシージャは、特定のデータ操作を実行する、再利用可能な名前付きSQLScriptブロックです。IN、OUT、INOUTパラメータを受け入れ、READS SQL DATAを使用して読み取り専用としてマークすることができ、CREATE PROCEDURE構文を使用してスキーマレベルまたはパッケージレベルで作成されます。

  • 🧱 作成場所を選択してください: スキーマ(カタログ)レベルまたはパッケージ(コンテンツ)レベルで、それらが属する場所に応じて手順を定義します。 SAP HANAデータモデル。
  • 📥 パラメータを意図的に使用する: INは入力を渡し、OUTは出力を返し、INOUTは入力と出力の両方を渡す。それぞれのシグネチャで明確にするために、これらの名称を明記する。
  • 🔐 SQLセキュリティは慎重に選択してください。 DEFINERは作成者の権限で実行され、INVOKERは呼び出し元の権限で実行されます。どちらを実行するかは、データアクセスポリシーに基づいて選択されます。
  • 📚 可能な場合は読み取り専用としてマークする: READS SQL DATA は、意図を文書化し、計画を最適化し、結果ビューを通じてプロシージャを公開できるようにします。
  • 🤖 AIを活用して手順書を作成する: AIアシスタントは、平易な英語で書かれたロジックを、パラメータ、例外処理、結果ビューを含むCREATE PROCEDUREテンプレートに変換します。

SAP HANA SQL ストアドプロシージャ

SQLストアドプロシージャとは何ですか?

A ストアドプロシージャ は、特定のタスクを実行する名前付きで再利用可能なコード単位です。プロシージャは、より大きなプログラムに構成することができ、これが の基礎となります。 モジュラーデザインある手続きが別の手続きを呼び出すことができる。呼び出し元は、 呼び出しプログラム.

プロシージャは、定義された一連のデータ変換を行う再利用可能な処理ブロックです。複数の入力パラメータと出力パラメータを受け入れることができ、読み取り専用または読み書き可能として宣言できます。

An SQL での手続き SAP HANA 作成場所:

  • スキーマレベル (カタログノード)—カタログを通じて管理され、適切な権限を持つすべてのコンシューマーから閲覧可能です。
  • パッケージレベル (コンテンツノード)— アプリケーションパッケージ内の設計時成果物として管理されます。

SAP HANAストアドプロシージャ構文

プロシージャを作成するための一般的な構文 SAP HANAを以下に示します。

CREATE PROCEDURE <proc_name> [(<parameter_clause>)] [LANGUAGE <lang>]
    [SQL SECURITY <mode>] [DEFAULT SCHEMA <default_schema_name>]
    [READS SQL DATA [WITH RESULT VIEW <view_name>]] AS
    { BEGIN [SEQUENTIAL EXECUTION]
        <procedure_body>
      END
    | HEADER ONLY }

その CREATE PROCEDURE ステートメントは、指定されたプログラミング言語を使用してプロシージャを作成します。 <lang>デフォルトの言語はSQLScriptです。

構文要素の説明

以下の表は、CREATE PROCEDURE構文で使用されるすべての句について説明しています。

素子 詳細説明
<proc_name> 手順の名称。
<parameter_clause> パラメータの一覧。各パラメータはIN、OUT、またはINOUTと表記されます。
IN — プロシージャに渡される読み取り専用の入力。
OUT — プロシージャから返される出力。
入力 ― 値を入力として渡し、変更後の値を返す。
LANGUAGE <lang> プロシージャで使用されるプログラミング言語。デフォルト:SQLSCRIPT。
SQL SECURITY <mode> セキュリティモード(デフォルト:DEFINER):
定義者 — プロシージャの作成者の権限で実行されます。
呼び出し元 — 呼び出し元の権限で実行されます。
DEFAULT SCHEMA <default_schema_name> プロシージャ本体内の修飾されていないオブジェクトを解決するために使用されるスキーマ。省略した場合、現在のセッションスキーマが使用されます。
READS SQL DATA このプロシージャを読み取り専用としてマークします。データやスキーマを変更することはできず、DDLやDMLを含まず、他の読み取り専用プロシージャを呼び出すことのみ可能です。
WITH RESULT VIEW <view_name> プロシージャの出力として使用される結果ビューを定義します。結果ビューが存在する場合、プロシージャは別のプロシージャからクエリできます。 SQL まるでテーブルやビューであるかのようにステートメントを扱います。
SEQUENTIAL EXECUTION プロシージャ本体を並列処理なしで順次実行するように強制します。
<procedure_body> 選択したプログラミング言語で記述された、手順の本体部分。
HEADER ONLY プロシージャ本体をコンパイルせずに、OIDを持つプロシージャのプロパティのみを作成します。前方宣言に便利です。

例:シンプルなストアドプロシージャを作成する

以下の例では、指定された顧客の売上合計を返す読み取り専用のプロシージャを作成します。

CREATE PROCEDURE GET_CUSTOMER_SALES (
    IN  iv_customer_id NVARCHAR(10),
    OUT ev_total       DECIMAL(15,2)
)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
READS SQL DATA AS
BEGIN
    SELECT SUM(NET_VALUE) INTO ev_total
    FROM   "SALES"."ORDERS"
    WHERE  CUSTOMER_ID = :iv_customer_id;
END;

プロシージャを呼び出すには、以下を使用します。

CALL GET_CUSTOMER_SALES ('C0001', ?);

SAP HANA Studio(または任意のJDBC/ODBCクライアント)は、以下の値を返します。 ev_total 出力パラメータにおいて。

ストアドプロシージャの呼び出し

ストアドプロシージャが作成されると、 CALL ステートメントは、オプションで別のプロシージャ、SQLScript関数、または外部クライアント内で使用できます。最も一般的な呼び出しパターンは次の4つです。

  • SQLから: CALL my_proc(p1, p2, ?); — プレースホルダーはOUT値を返します。
  • 別の手順から: CALL another_proc(:in1, :out1);
  • アプリケーションから: JDBC、ODBC、またはCloud SDKを介して入力パラメータをバインドし、出力を読み取ります。
  • 仮想テーブルとして: 結果ビューが宣言されている場合は、ビュー名に対してSELECT文を使用してプロシージャを照会します。

HANAストアドプロシージャのベストプラクティス

以下の習慣を実践することで、HANAのプロシージャは読みやすく、パフォーマンスが高く、保守しやすいものになります。

  • 接頭辞付きのパラメータ名: iv_ 入力用、 ev_ 輸出用、 iov_ 入出力用。
  • READS SQL DATA で意図をマークする 手順が完全に読み取り専用である場合。
  • SQL SECURITY INVOKER を使用する 呼び出し元の権限を尊重すべき共有プロシージャの場合。
  • 各ブロックをBEGIN/ENDで囲む そして、本体は短く保ち、複雑なロジックはヘルパープロシージャに分割する。
  • 例外処理: つかいます DECLARE EXIT HANDLER 適切なエラー報告のために。
  • SELECT * を避ける 内部手順では、計画の安定性を保つために、実際に必要な列に名前を付けてください。

よくあるご質問

プロシージャは複数のOUTパラメータを持つことができ、DMLを発行でき、CALLで呼び出されます。関数は単一のスカラー値またはテーブル値を返し、副作用なく実行され、SELECT、WHERE、またはその他の式の中で使用されます。

デフォルトおよび最も一般的な言語はSQLScriptです。HANAは、統計ライブラリを必要とするプロシージャ向けにR、低レベルスクリプト向けにLもサポートしています。SQLScriptは、ほぼすべての業務プロシージャに適した選択肢です。

DEFINER は、プロシージャを作成したユーザーの権限でプロシージャを実行します。これは、プロシージャが呼び出し元が直接アクセスできないテーブルにアクセスする必要がある場合に便利です。INVOKER は呼び出し元の権限で実行されるため、共有ユーティリティプロシージャにはより安全です。

プロシージャがデータの読み取りのみを行い、書き込みを行わない場合は、READS SQL DATA を使用してください。これにより、意図が文書化され、結果ビューが可能になり、オプティマイザがプロシージャをより積極的に計画できるようになります。

CALL文を使用します。 CALL proc_name (in_val, out_param);アプリケーションから、JDBC、ODBC、またはCloud SDKドライバを介して入力と出力をバインドするか、RESTクライアント向けにODataを介してプロシージャを公開します。

手順を削除する DROP PROCEDURE proc_name; そして、CREATE OR REPLACE PROCEDURE を使用してそれを再作成します。 SAP HANAはALTER PROCEDUREをサポートしていません。標準的なパターンはCREATE OR REPLACEです。

AIアシスタントは、CREATE PROCEDUREテンプレートを生成し、パラメータ名を提案し、例外ハンドラーを作成し、平易な英語のロジックをSQLScriptに変換します。また、スキーマ修飾子の欠落や、読み取り専用コンテキスト内での危険なDML操作も指摘します。

はい。AIツールはSQLScriptを1行ずつ注釈付けし、各パラメータの機能、特定の結合が選択された理由、不正な入力によってプロシージャが失敗する可能性のある箇所などを説明するため、コードレビューとオンボーディングが大幅に迅速化されます。