Native SQL


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>里來一行行讀取,如果不需要處理返回結果,或者是UPDATEDELETE語句時,可以省略選項。

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

也可以。

 

image210

調用存儲過程

EXECUTE PROCEDURE<name> ( <parameter list> )

參數以逗號分隔,並需要INOUT 來指定是輸入還是輸出參數,或者是使用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
.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM