abap-sql-amdp について
abap-sql-amdpは、SQLとAMDPを扱うABAP開発者向けのガイドです。最新のクエリ構文、データベースプロシージャ、Clean Coreの制約を解説します。
主な機能
- 01最新ABAP SQL構文のリファレンス
- 02ウィンドウ関数、CTE、集合演算の例
- 03AMDPプロシージャとCDSテーブル関数のガイド
- 04PRIVILEGED ACCESSの用途を説明
- 05Clean Coreレベル別のSQL利用指針
活用シーン
- 01ABAP SQLクエリの作成や最適化
- 02AMDPプロシージャやCDSテーブル関数の実装
- 03SAPデータベーステーブルへの直接アクセスの評価
- 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スキルを参照してください。
ワークフロー
-
ユーザーの目的を把握します:
- ABAP SQL クエリの作成または最適化
- 高度な SQL 機能(ウィンドウ関数、CTE、集計)の使用
- AMDP プロシージャまたは関数の作成
- AMDP による CDS テーブル関数の実装
- 権限チェックを回避する PRIVILEGED ACCESS の理解
-
コンテキストを特定します:
- ABAP for Cloud Development と Standard ABAP のどちらか(使用可能な構文に影響します)
- パフォーマンス最適化の必要性
- AMDP が妥当かどうか(可能な場合は ABAP SQL を優先します)
-
最新の 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 |
| NULL | COALESCE、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-ONLY | ABAP 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]
参考資料
- ABAP SQL チートシート:https://github.com/SAP-samples/abap-cheat-sheets
- AMDP チートシート:https://github.com/SAP-samples/abap-cheat-sheets/blob/main/12_AMDP.md
- ABAP SQL リファレンス:https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_sql.htm
SQL および AMDP のクリーンコアレベルに関する注意事項
| シナリオ | レベル | 注意事項 |
|---|---|---|
リリース済み CDS ビュー(I_*)からの SELECT | A | 目標状態 |
独自のカスタムテーブルからの SELECT | A | 同じソフトウェアコンポーネント内で許可されます |
クラシック(指定済み)SAP CDS ビューからの SELECT | B | クラシック ABAP 開発では許容されます |
| SAP データベーステーブルからの直接 読み取り | C | ATC 優先度 2 — 代わりにリリース済み CDS ビューを使用してください |
| SAP データベーステーブルへの直接 書き込み | D | ATC 優先度 1 — リリース済みまたはクラシック API を使用してください |
EXEC SQL(ネイティブ SQL) | D | 重大なステートメント — ABAP SQL または AMDP を使用してください |
| データベースヒント | D | 重大なステートメント |
| リリース済み CDS ビューを使用する AMDP | A | USING の対象をリリース済みエンティティに限定してください |
| SAP テーブルを使用する AMDP | C/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の設定に使用します