新疆建設(shè)廳官方網(wǎng)站文件鏈接推廣
💂作者簡(jiǎn)介: THUNDER王,一名熱愛(ài)財(cái)稅和SAP ABAP編程以及熱愛(ài)分享的博主。目前于江西師范大學(xué)會(huì)計(jì)學(xué)專業(yè)大二本科在讀,同時(shí)任漢碩云(廣東)科技有限公司ABAP開(kāi)發(fā)顧問(wèn)。在學(xué)習(xí)工作中,我通常使用偏后端的開(kāi)發(fā)語(yǔ)言ABAP,SQL進(jìn)行任務(wù)的完成,對(duì)SAP企業(yè)管理系統(tǒng),SAP ABAP開(kāi)發(fā)和數(shù)據(jù)庫(kù)具有較深入的研究。
💅文章概要: 各位小伙伴們大家好呀!今天繼續(xù)SAP ABAP系列文章的講解,本節(jié)帶來(lái)的內(nèi)容是OPEN SQL中SELECT語(yǔ)句的介紹,希望大家喜歡!
🤟每日一言: 永遠(yuǎn)年輕,永遠(yuǎn)熱淚盈眶!
目錄
- 前言
- SELECT語(yǔ)句介紹
- SELECT語(yǔ)句變式
- ? SELECT SINGLE
- ? ?案例演示
- ? SELECT SEVERAL LINE
- ? ?案例演示
- SELECT并輸出打印
- ? SELECT……ENDSELECT
- ? SELECT(LOOP……ENDLOOP)
- SELECT……AS
- 動(dòng)態(tài)SELECT語(yǔ)句
- DISTINCT
- FOR UPDATE
- 寫(xiě)在最后的話
前言
??各位小伙伴們大家好呀!今天繼續(xù)SAP ABAP系列文章的講解,本節(jié)帶來(lái)的內(nèi)容是OPEN SQL中SELECT語(yǔ)句的介紹,希望大家喜歡!
SELECT語(yǔ)句介紹
??在ABAP中,SELECT語(yǔ)句
用于從數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù),它與傳統(tǒng)的SQL語(yǔ)句有相似之處,也有獨(dú)特于ABAP的特性
,下面是OPEN SQL中標(biāo)準(zhǔn)的代碼語(yǔ)法樣例:
SELECT <fields>FROM <table>[WHERE <condition>][ORDER BY <fields> [ASC|DESC]][GROUP BY <fields> [HAVING <condition>]][INTO <internal table>][FOR ALL ENTRIES IN <internal table>][UP TO <n> ROWS][HINT <hint>].
參數(shù)介紹:
<fields>
:需要檢索的字段列表。<table>
:需要從中檢索數(shù)據(jù)的數(shù)據(jù)庫(kù)表。<condition>
:可選項(xiàng),用于過(guò)濾檢索結(jié)果的條件。<internal table>
:可選項(xiàng),表示檢索結(jié)果將被存儲(chǔ)在內(nèi)部表中。FOR ALL ENTRIES IN <internal table>
:可選項(xiàng),表示使用內(nèi)部表中的值作為條件來(lái)檢索數(shù)據(jù)。<n>
:可選項(xiàng),表示返回的最大行數(shù)。<hint>
:可選項(xiàng),用于優(yōu)化數(shù)據(jù)庫(kù)查詢。
SELECT語(yǔ)句變式
??在ABAP中,SELECT語(yǔ)句不僅可以檢索多行數(shù)據(jù),還可以檢索單行數(shù)據(jù)
。為了滿足這兩種不同的檢索需求,ABAP提供了兩種SELECT語(yǔ)句的變體:SELECT SINGLE
和SELECT SEVERAL LINE
。
? SELECT SINGLE
??SELECT SINGLE
語(yǔ)句用于從數(shù)據(jù)庫(kù)中檢索單個(gè)行,并將其存儲(chǔ)在內(nèi)部表中。如果檢索到多行數(shù)據(jù),則只返回第一行數(shù)據(jù)
。
??以下是SELECT SINGLE語(yǔ)句的語(yǔ)法:
SELECT SINGLE <fields>FROM <table>[WHERE <condition>][ORDER BY <fields> [ASC|DESC]][INTO <internal table>][FOR UPDATE].
PS:
所有參數(shù)同SELECT語(yǔ)句介紹一致
? ?案例演示
??在這個(gè)案例中,首先聲明一個(gè)sflight表的結(jié)構(gòu)體類型ls_flight
,然后使用SELECT SINGLE
語(yǔ)句檢索連接ID為0820
的航班的航空公司、連接ID、日期和價(jià)格,并將數(shù)據(jù)存儲(chǔ)在結(jié)構(gòu)體ls_flight中
。最后,使用WRITE語(yǔ)句將檢索到的航班數(shù)據(jù)輸出到屏幕上。
DATA: ls_flight TYPE sflight.* Select a flight with connection ID = 0820 and store the data in a structure
SELECT SINGLE carrid, connid, fldate, priceFROM sflightWHERE connid = '0820'INTO ls_flight.* Display the flight data
WRITE: / 'Flight', ls_flight-connid, 'on', ls_flight-fldate,'with airline', ls_flight-carrid, 'costs', ls_flight-price, 'USD'.
? SELECT SEVERAL LINE
? ?SELECT SEVERAL LINE
語(yǔ)句用于從數(shù)據(jù)庫(kù)中檢索多個(gè)行,并將其存儲(chǔ)在內(nèi)部表
中。如果沒(méi)有檢索到數(shù)據(jù),則返回空內(nèi)部表
。
??以下是SELECT SEVERAL LINE語(yǔ)句的語(yǔ)法:
SELECT <fields>FROM <table>[WHERE <condition>][ORDER BY <fields> [ASC|DESC]][GROUP BY <fields> [HAVING <condition>]][INTO <internal table>][FOR ALL ENTRIES IN <internal table>][UP TO <n> ROWS][HINT <hint>].
PS:
所有參數(shù)同SELECT語(yǔ)句介紹一致
? ?案例演示
??在這個(gè)案例中,首先聲明一個(gè)內(nèi)部表it_flight
,其類型為自定義類型ty_flight,該類型包含航空公司、連接ID、日期和價(jià)格字段。然后,使用SELECT SEVERAL LINE
語(yǔ)句檢索航空公司代碼為L(zhǎng)H的所有航班的航空公司、連接ID、日期和價(jià)格,并將數(shù)據(jù)存儲(chǔ)在內(nèi)部表it_flight中。最后,使用LOOP AT語(yǔ)句遍歷內(nèi)部表中的每個(gè)航班數(shù)據(jù)
,并使用WRITE語(yǔ)句
將其輸出到屏幕上。
TYPES: BEGIN OF ty_flight,carrid TYPE sflight-carrid,connid TYPE sflight-connid,fldate TYPE sflight-fldate,price TYPE sflight-price,END OF ty_flight.DATA: it_flight TYPE STANDARD TABLE OF ty_flight.* Select all flights with airline code 'LH' and store the data in an internal table
SELECT carrid, connid, fldate, priceFROM sflightWHERE carrid = 'LH'INTO TABLE it_flight.* Display the flight data
WRITE: / 'Flights operated by airline LH:'.
LOOP AT it_flight INTO DATA(ls_flight).WRITE: / ls_flight-connid, 'on', ls_flight-fldate, 'costs', ls_flight-price, 'USD'.
ENDLOOP.
SELECT并輸出打印
??下面介紹ABAP中兩種SELECT并且輸出打印的方式,其中第一種是先將數(shù)據(jù)SELECT到結(jié)構(gòu)體變量中,然后輸出打印
;第二種是先將數(shù)據(jù)SELECT到內(nèi)部表中,然后使用LOOP語(yǔ)句遍歷內(nèi)表最終輸出打印到屏幕上
。
? SELECT……ENDSELECT
DATA:GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA:GS_SFLIGHT TYPE SFLIGHT.SELECT * INTO GS_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDSELECT.
? SELECT(LOOP……ENDLOOP)
DATA: GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA: GS_SFLIGHT TYPE SFLIGHT.SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDLOOP.
SELECT……AS
??在ABAP中,使用SELECT AS
可以為查詢結(jié)果的列定義別名
。這對(duì)于使用SELECT語(yǔ)句構(gòu)建動(dòng)態(tài)SQL語(yǔ)句
和生成報(bào)表
非常有用。
SELECT <columns> AS <alias>...
參數(shù)介紹
<columns>
:數(shù)據(jù)庫(kù)表中字段。<alias>
:字段別名。
??下面給出一個(gè)詳細(xì)的案例進(jìn)行詳解:
DATA: GT_SFLIGHT TYPE TABLE OF SFLIGHT,GS_SFLIGHT TYPE SFLIGHT.SELECT CARRID AS 'Airline Code',CONNID AS 'Connection ID'INTO TABLE GT_SFLIGHTFROM SFLIGHTWHERE CARRID = 'LH'.LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.WRITE:/ GS_SFLIGHT-'Airline Code', GS_SFLIGHT-'Connection ID'.
ENDLOOP.
??在這個(gè)例子中,我們使用SELECT AS
為CARRID和CONNID兩個(gè)列定義了別名
。這個(gè)別名可以在程序中被引用,這樣我們就可以避免使用SFLIGHT表中的實(shí)際列名
。
??在程序的輸出中,我們使用GS_SFLIGHT-'Airline Code'
和GS_SFLIGHT-'Connection ID'
來(lái)引用別名,這樣輸出的結(jié)果中將顯示別名。
動(dòng)態(tài)SELECT語(yǔ)句
??在ABAP中,可以使用動(dòng)態(tài)SELECT語(yǔ)句
來(lái)構(gòu)建在運(yùn)行時(shí)構(gòu)建SQL語(yǔ)句的能力
。這對(duì)于需要根據(jù)用戶輸入或條件動(dòng)態(tài)構(gòu)建SQL語(yǔ)句的應(yīng)用程序非常有用。
??下面給出一個(gè)詳細(xì)的案例進(jìn)行詳解:
DATA: gt_result TYPE TABLE OF sflight,gs_result TYPE sflight,lv_carrid TYPE sflight-carrid.*獲取用戶輸入的Airline Code
PARAMETERS p_carrid TYPE sflight-carrid.*構(gòu)建動(dòng)態(tài)SQL語(yǔ)句
CONCATENATE 'SELECT * FROM sflight WHERE carrid =' p_carrid INTO lv_sql.
CREATE DATA gt_result TYPE TABLE OF (sflight).
ASSIGN gt_result->* TO FIELD-SYMBOL(<fs_result>).
EXEC SQL PERFORMING <fs_result>INTO TABLE :gt_resultUSING :lv_sql.*輸出結(jié)果
LOOP AT gt_result INTO gs_result.WRITE:/ gs_result-carrid, gs_result-connid, gs_result-fldate, gs_result-price.
ENDLOOP.
??在這個(gè)示例中,我們首先使用PARAMETERS語(yǔ)句
定義了一個(gè)用戶可以輸入的參數(shù)p_carrid
。然后,我們將該參數(shù)與一個(gè)SELECT語(yǔ)句的一部分拼接起來(lái),構(gòu)建了一個(gè)動(dòng)態(tài)的SQL語(yǔ)句lv_sql
。
??接下來(lái),我們使用CREATE DATA
語(yǔ)句動(dòng)態(tài)創(chuàng)建了一個(gè)內(nèi)部表gt_result
,然后使用ASSIGN
語(yǔ)句將該內(nèi)部表的指針賦值給一個(gè)FIELD-SYMBOL
變量<fs_result>
。
??最后,我們使用EXEC SQL語(yǔ)句
執(zhí)行了動(dòng)態(tài)SQL
語(yǔ)句,并將結(jié)果存儲(chǔ)在內(nèi)部表gt_result
中。在循環(huán)中,我們遍歷內(nèi)部表并輸出結(jié)果。
PS:需要注意的是,動(dòng)態(tài)SELECT語(yǔ)句需要使用EXEC SQL語(yǔ)句來(lái)執(zhí)行,而不是ABAP的SELECT語(yǔ)句。此外,我們還可以使用CONCATENATE語(yǔ)句和其他字符串操作函數(shù)來(lái)構(gòu)建動(dòng)態(tài)SQL語(yǔ)句。通過(guò)使用動(dòng)態(tài)SELECT語(yǔ)句,我們可以根據(jù)不同的條件構(gòu)建不同的SQL語(yǔ)句,并以此實(shí)現(xiàn)高度靈活的應(yīng)用程序。
DISTINCT
??[DISTINCT]
為OPEN SQL中SELECT語(yǔ)句的可選項(xiàng),若選擇則自動(dòng)刪除所查詢數(shù)據(jù)的重復(fù)項(xiàng)!
在某些場(chǎng)景中,我們需要對(duì)查到的數(shù)據(jù)進(jìn)行去重
的操作,這時(shí)候便需要加上DISTINCT
可選項(xiàng)!
??下面給出一個(gè)詳細(xì)的案例進(jìn)行講解:
DATA:GT_SFLIGHT TYPE TABLE OF SFLIGHT.
DATA:GS_SFLIGHT TYPE SFLIGHT.
DATA:GS_LINE(72) TYPE C.GS_LINE = 'CARRID CONNID'.SELECT DISTINCT (GS_LINE) INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT FROM SFLIGHT WHERE CARRID = 'AC'.LOOP AT GT_SFLIGHT INTO GS_SFLIGHT.WRITE:/ GS_SFLIGHT-CARRID,GS_SFLIGHT-CONNID.
ENDLOOP.
??在SFLIGHT數(shù)據(jù)庫(kù)表中,CARRID等于‘AC’
的數(shù)據(jù)有兩條,使用了DISTINCT
語(yǔ)句后查詢出來(lái)的數(shù)據(jù)便只有一條
了。
FOR UPDATE
? ?在ABAP中,SELECT SINGLE
語(yǔ)句可以使用FOR UPDATE
選項(xiàng)來(lái)鎖定檢索到的行
,以便在事務(wù)期間對(duì)它們進(jìn)行更新或刪除操作。當(dāng)使用FOR UPDATE選項(xiàng)時(shí),會(huì)在數(shù)據(jù)庫(kù)中為檢索到的行設(shè)置鎖,防止其他用戶同時(shí)修改相同的數(shù)據(jù)
。
? ?下面給出一個(gè)詳細(xì)的案例進(jìn)行詳解:
START-OF-SELECTION.DATA: lv_name TYPE zemployee-name,lv_salary TYPE zemployee-salary.* Select employee with ID = 123 and lock the row for update
SELECT SINGLE name, salaryFROM zemployeeWHERE id = '123'INTO (lv_name, lv_salary)FOR UPDATE.* Update the employee's salary
lv_salary = lv_salary + 1000.* Commit the changes
COMMIT WORK.
? ?在這個(gè)示例中,首先使用SELECT SINGLE語(yǔ)句檢索ID為123的員工姓名和工資,并將該行鎖定以進(jìn)行更新
。然后,將員工的工資增加1000,并在事務(wù)結(jié)束時(shí)提交更改。由于該行被鎖定,其他用戶無(wú)法同時(shí)更新相同的數(shù)據(jù)
。
寫(xiě)在最后的話
??本文花費(fèi)大量時(shí)間介紹了OPEN SQL中SELECT語(yǔ)句的詳細(xì)語(yǔ)法
,希望能幫助到各位小伙伴,碼文不易,還望各位大佬們多多支持哦,你們的支持是我最大的動(dòng)力!
?原創(chuàng)不易,還希望各位大佬支持一下\textcolor{blue}{原創(chuàng)不易,還希望各位大佬支持一下}原創(chuàng)不易,還希望各位大佬支持一下
👍 點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動(dòng)力!\textcolor{9c81c1}{點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動(dòng)力!}點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動(dòng)力!
?? 收藏,你的青睞是我努力的方向!\textcolor{ed7976}{收藏,你的青睞是我努力的方向!}收藏,你的青睞是我努力的方向!
?? 評(píng)論,你的意見(jiàn)是我進(jìn)步的財(cái)富!\textcolor{98c091}{評(píng)論,你的意見(jiàn)是我進(jìn)步的財(cái)富!}評(píng)論,你的意見(jiàn)是我進(jìn)步的財(cái)富!