原文連結:Implementing Basic SELECT Statements
所有的關聯式資料庫都可以使用SQL存取資料,而SQL是由三種主元件組成的:
Data Manipulation Language (DML)
用來處理表格內的資訊,包含最常用的增刪改查(NSERT / SELECT / UPDATE / DELETE),這些語法可以直接對應到ABAP SQL。
Data Definition Language (DDL)
提供創建表格以及其他表格物件的指令,如架構、索引跟視圖等,這些會透過ADT的特定編輯器執行,而非ABAP programs。
Data Control Language (DCL)
可以限制特定使用者對資料的存取,但在ABAP中並非以經典寫法呈現,為了滿足不同母集團與子公司間的一對多關係,因其在使用者結構上並不是一對一的。
在過往為了兼容不同資料庫,會將ABAP SQL按照各種資料庫的SQL語法轉譯成Native SQL。即使新版ABAP只支援HANA,仍然保有這些資料庫介面,主要基於以下理由:
DATA airport_from_id TYPE /DMO/airport_from_id.
SELECT SINGLE
FROM /dmo/connection
FIELDS airport_from_id
WHERE carrier_id = 'LH' AND connection_id = '0400'
INTO @airport_from_id.
SELECT
為開頭,SELECT
後方接的SINGLE
代表在這個查詢僅讀取一筆資料。FIELDS *
搜整張表。WHERE
指定要篩選的條件,例如 WHERE carrier_id = 'LH'
會搜尋該欄值為'LH'的資料,可用AND
OR
NOT
等條件運算子組合條件。雖然不一定要加上WHERE
,但由於不加將會回傳整張表的資料,可能會造成效能問題。DATA airport_from_id TYPE /DMO/airport_from_id.
SELECT SINGLE
FROM /dmo/connection
FIELDS airport_from_id
WHERE carrier_id = 'LH'
AND connection_id = '0400'
INTO @airport_from_id.
目標值FRA
將被存入ABAP物件airport_from_id
中,注意變數與常數都須在前面加上@
作為識別,避免出現變數與表格同名的歧意問題。
DATA airport_from_id TYPE /DMO/airport_from_id.
SELECT SINGLE
FROM /dmo/connection
FIELDS airport_from_id,@airport_to_id
WHERE carrier_id = 'LH'
AND connection_id = '0400'
INTO (@airport_from_id,@airport_to_id).
當搜尋的是同一筆資料列中的多個欄位,除了用逗號隔開欄位,還需要依回傳的欄位量,設定相應變數來存入搜尋結果。上面的範例便是取搜尋結果的其中兩欄回傳,並分別存入變數@airport_from_id
及@airport_to_id
之中。
DATA airport_from_id TYPE /DMO/airport_from_id.
SELECT SINGLE
FROM /dmo/connection
FIELDS airport_from_id
"表格不存在以下條件的資料"
WHERE carrier_id = 'XX'
AND connection_id = '1234'
INTO @airport_from_id.
假設搜尋條件如上例,為一個沒有相符結果的搜尋,ABAP SQL可以使用SY-SUBRC
此一系統整數值來辨別是否成功搜到結果,當SY-SUBRC
回傳0代表成功搜尋到查詢結果,然而在SELECT
後SY-SUBRC
回傳4則代表找不到相關資料,回傳空結果。當回傳空結果時,這時將不會觸發存取INTO
後的變數,其值將維持不變。
可以運用這個特性,設置找不到內容時的IF條件運算子,寫法如下:
SELECT ...
"sy-subrc回傳0代表有搜尋到資料,回傳4則代表沒搜到資料"
IF sy-subrc = 0.
...
ELSE.
...
ENDIF.
SY-SUBRC
盡量接在SELECT
段落一結束的地方,避免SY-SUBRC
的值又被變更
下一章開始要進入ABAP特有的CDS view囉!