mcpField
A
abap-sql-amdp

abap-sql-amdp

github.com/likweitanデータ・データベース7297 回インストール2 週間前に更新
リポジトリ

abap-sql-amdp について

abap-sql-amdpは、SQLとAMDPを扱うABAP開発者向けのガイドです。最新のクエリ構文、データベースプロシージャ、Clean Coreの制約を解説します。

主な機能

  1. 01最新ABAP SQL構文のリファレンス
  2. 02ウィンドウ関数、CTE、集合演算の例
  3. 03AMDPプロシージャとCDSテーブル関数のガイド
  4. 04PRIVILEGED ACCESSの用途を説明
  5. 05Clean Coreレベル別のSQL利用指針

活用シーン

  1. 01ABAP SQLクエリの作成や最適化
  2. 02AMDPプロシージャやCDSテーブル関数の実装
  3. 03SAPデータベーステーブルへの直接アクセスの評価
  4. 04レガシーコードをABAP SQLまたはAMDPへ移行

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/likweitan/abap-skills --skill abap-sql-amdp

インストール後、Claude Code で/abap-sql-amdpを入力して読み込まれたか確認します。

同梱ファイルreferences/sql-functions-reference.md

詳細

ABAP SQL と AMDP

ABAP Cloud および Standard ABAP で最新の ABAP SQL ステートメントと ABAP Managed Database Procedures(AMDP)を記述するためのガイドです。

クリーンコアのコンテキスト:リリース済み CDS ビューからの SELECT は レベル A です。SAP データベーステーブルへの直接の読み取りアクセスは レベル C(ATC 優先度 2)、直接の書き込みアクセスは レベル D(ATC 優先度 1)です。EXEC SQL(ネイティブ SQL)はクリティカルなステートメント → レベル Dです。SYCM_USAGE_OF_APIS は、SAP データベーステーブルおよびビューに対する SQL ステートメントをレポートします。レベルの詳細については、abap-cloud スキルを参照してください。

ワークフロー

  1. ユーザーの目的を把握します:

    • ABAP SQL クエリの作成または最適化
    • 高度な SQL 機能(ウィンドウ関数、CTE、集計)の使用
    • AMDP プロシージャまたは関数の作成
    • AMDP による CDS テーブル関数の実装
    • 権限チェックを回避する PRIVILEGED ACCESS の理解
  2. コンテキストを特定します:

    • ABAP for Cloud Development と Standard ABAP のどちらか(使用可能な構文に影響します)
    • パフォーマンス最適化の必要性
    • AMDP が妥当かどうか(可能な場合は ABAP SQL を優先します)
  3. 最新の ABAP SQL 構文を使用して実装をガイドします

最新の ABAP SQL クイックリファレンス

インライン宣言を使用した基本的な SELECT
"Single record
SELECT SINGLE FROM ztravel
  FIELDS travel_id, description, total_price, currency_code
  WHERE travel_id = @lv_travel_id
  INTO @DATA(ls_travel).

"Multiple records into internal table
SELECT FROM ztravel
  FIELDS travel_id, description, total_price, currency_code
  WHERE status = 'O'
  ORDER BY total_price DESCENDING
  INTO TABLE @DATA(lt_travels)
  UP TO 100 ROWS.
SELECT リスト内の式
SELECT FROM zflight
  FIELDS carrier_id,
         connection_id,
         flight_date,
         seats_max - seats_occupied AS seats_free,
         CASE WHEN seats_occupied > seats_max * 80 / 100
              THEN 'FULL'
              ELSE 'AVAILABLE'
         END AS availability,
         CAST( price AS DECFLOAT34 ) AS price_dec,
         CONCAT( carrier_id, connection_id ) AS flight_key
  INTO TABLE @DATA(lt_flights).
集計関数と GROUP BY
SELECT FROM zflight
  FIELDS carrier_id,
         COUNT(*) AS flight_count,
         SUM( seats_occupied ) AS total_passengers,
         AVG( price ) AS avg_price,
         MIN( flight_date ) AS first_flight,
         MAX( flight_date ) AS last_flight
  GROUP BY carrier_id
  HAVING COUNT(*) > 10
  INTO TABLE @DATA(lt_stats).
ウィンドウ関数
SELECT FROM zflight
  FIELDS carrier_id,
         connection_id,
         flight_date,
         price,
         "Running total
         SUM( price ) OVER( PARTITION BY carrier_id
                            ORDER BY flight_date
                            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS running_total,
         "Row number within partition
         ROW_NUMBER( ) OVER( PARTITION BY carrier_id
                             ORDER BY flight_date DESCENDING ) AS row_num,
         "Ranking
         RANK( ) OVER( PARTITION BY carrier_id ORDER BY price DESCENDING ) AS price_rank,
         "Lead/Lag
         LAG( price, 1 ) OVER( PARTITION BY carrier_id ORDER BY flight_date ) AS prev_price,
         LEAD( price, 1 ) OVER( PARTITION BY carrier_id ORDER BY flight_date ) AS next_price
  INTO TABLE @DATA(lt_window).
共通テーブル式(CTE)
WITH
  +connections AS (
    SELECT FROM zflsch
      FIELDS carrier_id, connection_id, city_from, city_to
      WHERE carrier_id IN @lt_carriers ),
  +flight_counts AS (
    SELECT FROM zflight
      FIELDS carrier_id, connection_id,
             COUNT(*) AS cnt
      GROUP BY carrier_id, connection_id ),
  +result AS (
    SELECT FROM +connections AS c
      INNER JOIN +flight_counts AS f
        ON c~carrier_id = f~carrier_id AND c~connection_id = f~connection_id
      FIELDS c~carrier_id, c~city_from, c~city_to, f~cnt )
  SELECT FROM +result
    FIELDS *
    ORDER BY cnt DESCENDING
    INTO TABLE @DATA(lt_result).
集合演算(UNION、INTERSECT、EXCEPT)
"UNION ALL (keeps duplicates) / UNION (removes duplicates)
SELECT FROM ztable1 FIELDS col1, col2
UNION ALL
SELECT FROM ztable2 FIELDS col1, col2
INTO TABLE @DATA(lt_union).

"INTERSECT — rows in both
SELECT FROM ztable1 FIELDS col1
INTERSECT
SELECT FROM ztable2 FIELDS col1
INTO TABLE @DATA(lt_intersect).

"EXCEPT — rows in first but not second
SELECT FROM ztable1 FIELDS col1
EXCEPT
SELECT FROM ztable2 FIELDS col1
INTO TABLE @DATA(lt_except).
PRIVILEGED ACCESS

CDS アクセス制御(DCL)を回避します。使用には注意してください。

"Skips access control defined in CDS DCL
SELECT FROM zi_travel
  FIELDS travel_id, description
  WHERE status = 'O'
  INTO TABLE @DATA(lt_all_travels)
  PRIVILEGED ACCESS.
組み込み SQL 関数
カテゴリ関数
文字列CONCAT、SUBSTRING、LENGTH、LEFT、RIGHT、LTRIM、RTRIM、UPPER、LOWER、REPLACE、LPAD、RPAD
数値ABS、CEIL、FLOOR、ROUND、MOD、DIV、DIVISION
日付/時刻DATS_ADD_DAYS、DATS_DAYS_BETWEEN、TSTMP_ADD_SECONDS、TSTMP_CURRENT_UTCTIMESTAMP、DATN_ADD_MONTHS
変換CAST、COALESCE、CURRENCY_CONVERSION、UNIT_CONVERSION
NULLCOALESCE、CASE WHEN ... IS NULL
集計COUNT、SUM、AVG、MIN、MAX、STRING_AGG
サブクエリ
"Scalar subquery
SELECT FROM ztravel
  FIELDS travel_id,
         total_price,
         ( SELECT AVG( total_price ) FROM ztravel ) AS avg_price
  INTO TABLE @DATA(lt_with_avg).

"EXISTS subquery
SELECT FROM ztravel AS t
  FIELDS t~travel_id, t~description
  WHERE EXISTS ( SELECT FROM zbooking AS b
                   WHERE b~travel_id = t~travel_id
                     AND b~flight_date > @sy-datum )
  INTO TABLE @DATA(lt_with_bookings).

AMDP(ABAP Managed Database Procedures)

AMDP を使用する場合
  • ほとんどのシナリオでは ABAP SQL を優先します
  • 複雑な計算で SQLScript を利用すると効果がある場合、CDS テーブル関数が必要な場合、または大量データ処理にデータベースレベルの最適化が必要な場合は、AMDP を使用します
AMDP クラスの構造
CLASS zcl_my_amdp DEFINITION
  PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.  "Mandatory for AMDP

    TYPES: BEGIN OF ty_result,
             carrier_id TYPE s_carr_id,
             total      TYPE i,
           END OF ty_result,
           tt_result TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY.

    "AMDP procedure
    METHODS get_carrier_stats
      AMDP OPTIONS READ-ONLY CDS SESSION CLIENT DEPENDENT
      EXPORTING VALUE(et_result) TYPE tt_result.

    "AMDP table function for CDS table function
    CLASS-METHODS get_data FOR TABLE FUNCTION zdemo_amdp_tf.
ENDCLASS.
AMDP プロシージャの実装
METHOD get_carrier_stats
  BY DATABASE PROCEDURE
  FOR HDB
  LANGUAGE SQLSCRIPT
  OPTIONS READ-ONLY
  USING zflight_ve.

  et_result = SELECT carrier_id,
                     COUNT(*) AS total
              FROM zflight_ve
              GROUP BY carrier_id
              ORDER BY total DESC;
ENDMETHOD.
CDS テーブル関数向け AMDP テーブル関数

CDS テーブル関数の定義:

@ClientHandling.type: #CLIENT_DEPENDENT
@ClientHandling.algorithm: #SESSION_VARIABLE
define table function ZDEMO_AMDP_TF
  with parameters @Environment.systemField: #SYSTEM_LANGUAGE p_lang : abap.lang
  returns {
    key carrier_id : s_carr_id;
    carrier_name   : s_carrname;
    flight_count   : abap.int4;
  }
  implemented by method zcl_my_amdp=>get_data;

AMDP の実装:

METHOD get_data
  BY DATABASE FUNCTION
  FOR HDB
  LANGUAGE SQLSCRIPT
  OPTIONS READ-ONLY
  USING zcarrier_ve zflight_ve.

  RETURN SELECT c.carrier_id,
                c.carrier_name,
                COUNT(*) AS flight_count
         FROM zcarrier_ve AS c
         INNER JOIN zflight_ve AS f
           ON c.carrier_id = f.carrier_id
         GROUP BY c.carrier_id, c.carrier_name;
ENDMETHOD.
AMDP のクライアントセーフティ(ABAP Cloud)
追加指定用途
CDS SESSION CLIENT DEPENDENTクライアント依存の CDS ビューを使用します(最も一般的)
CLIENT INDEPENDENTクライアント非依存オブジェクトのみを使用します
AMDP OPTIONS READ-ONLYABAP for Cloud Development では必須です

出力形式

ABAP SQL または AMDP のトピックを支援する場合は、次の形式で回答してください。

## ABAP SQL / AMDP Guidance

### Query

[The ABAP SQL statement or AMDP implementation]

### Explanation

[Key features used and why]

### Performance Notes

[Optimization considerations if relevant]

参考資料

SQL および AMDP のクリーンコアレベルに関する注意事項

シナリオレベル注意事項
リリース済み CDS ビュー(I_*)からの SELECTA目標状態
独自のカスタムテーブルからの SELECTA同じソフトウェアコンポーネント内で許可されます
クラシック(指定済み)SAP CDS ビューからの SELECTBクラシック ABAP 開発では許容されます
SAP データベーステーブルからの直接 読み取りCATC 優先度 2 — 代わりにリリース済み CDS ビューを使用してください
SAP データベーステーブルへの直接 書き込みDATC 優先度 1 — リリース済みまたはクラシック API を使用してください
EXEC SQL(ネイティブ SQL)D重大なステートメント — ABAP SQL または AMDP を使用してください
データベースヒントD重大なステートメント
リリース済み CDS ビューを使用する AMDPAUSING の対象をリリース済みエンティティに限定してください
SAP テーブルを使用する AMDPC/D読み取り → C、書き込み → D
リリース済みエンティティを使用する AMDP 経由の CDS テーブル関数A有効なレベル A のプッシュダウン手法

パフォーマンスの改善:レガシーコードを適応させる際は、SQL Monitor を使用して最適化候補を検出し、その後、ネイティブ SQL やデータベースヒントに頼るのではなく、CDS、AMDP、ABAP SQL を使用してコードプッシュダウンを適用してください。

関連スキル

  • cds-view-entities:ABAP SQL で機能する CDS データモデリングに使用します
  • abap-cloud:クリーンコアレベルと SQL 関連の制限事項に使用します
  • rap:CDS ビューを使用する RAP データモデルの理解に使用します
  • abap-cloud-migration:改善時に直接テーブルアクセスと EXEC SQL を置き換えるために使用します
  • atc-cloudification:SYCM_USAGE_OF_APIS と CI_CRITICAL_STATEMENTS の設定に使用します

コメント