Native SQL允許你針對數據庫來使用原生的SQL,這些SQL可能是標准的SQL,也可以是某數據庫特定的SQL。如果使用database-specific SQL語句,則數據庫不能更換,否則請使用Open SQL。
本地SQL會繞過R/3 database interface,操作時不會記錄日志,不會同步應用服務器上的database buffer。另外,使用ABAP Dictionary定義的類型為LCHR or LRAW的長列時,這些列需要使用Open SQL來讀取,因為讀取這些字段時,還需要使用另外存儲此類型長列的長度信息,才能准確讀出。最后,本地SQL是不會自動能客戶端字段MANDT字段進行處理,該字段會像普通字段那樣對待。
為了事務的一致性,在本地SQL中不要使用事務控制的語句(如COMMIT, ROLLBACK WORK),以及事務設置語句(如級別設置)
普通SQL
EXEC SQL [PERFORMING <form>].
<Native SQL statement>[;]
ENDEXEC.
Native SQL statement后面的分號是可選的,但不能是“.”
如果Native SQL 是一個從表里SELECT statement時,你可以通過PERFORMING選項的<form>里來一行行讀取,如果不需要處理返回結果,或者是UPDATE、DELETE語句時,可以省略選項。
在ENDEXEC執行完后,SY-DBCNT存儲了處理的數據行數。在幾乎所有情況下,在執行ENDEXEC 后,SY-SUBRC都會為0,但是游標除外,在After FETCH之后,如果沒有讀取到數據,SY-SUBRC將會為4。
DATA: BEGIN OF wa,
connid TYPE spfli-connid,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
END OF wa.
DATA c1 TYPE spfli-carrid VALUE 'LH'.
"Native SQL語句不能以句點號結尾;
"不能在EXEC SQL…ENDEXEC間有注釋,即不能有星號與雙引號的出現;
"另外還要注意數據庫系統大小寫是否敏感;
"參數占位符使用冒號,而不是問號;
EXEC SQL PERFORMING loop_output.
SELECT connid, cityfrom, cityto
INTO :wa
FROM spfli
WHERE carrid = :c1
ENDEXEC.
FORM loop_output.
WRITE: / wa-connid, wa-cityfrom, wa-cityto.
ENDFORM
或者將上面的INTO :wa替換為:
INTO :wa-connid ,:wa-cityfrom ,:wa-cityto
也可以。
調用存儲過程
EXECUTE PROCEDURE<name> ( <parameter list> )
參數以逗號分隔,並需要IN、OUT 來指定是輸入還是輸出參數,或者是使用INOUT來表示即是輸入也是輸出參數
EXEC SQL.
EXECUTE PROCEDURE proc1 ( IN :x, OUT :y )
ENDEXEC.
游標處理:
•OPEN<cursor name>FOR<statement>
•FETCH NEXT <cursor name>INTO<target(s)>.
•CLOSE<cursor name>
DATA: arg1 TYPE string VALUE '800'.
TABLES: t001.
"打開游標
EXEC SQL.
OPEN c1 FOR SELECT MANDT, BUKRS FROM T001
WHERE MANDT = :arg1 AND BUKRS >= 'ZA01'
ENDEXEC.
DO.
"讀取游標
EXEC SQL.
FETCH NEXT c1 INTO :t001-mandt, :t001-bukrs
ENDEXEC.
IF sy-subrc <> 0.
EXIT.
ELSE.
WRITE: / t001-mandt, t001-bukrs.
ENDIF.
ENDDO.
"關閉游標
EXEC SQL.
CLOSE c1
ENDEXEC.