ABAP SQL语法经验总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ABAP中的 Sql编辑
关键字:ABAP sql
SQL语法
我们在编写ABAP4程序的时候,经常需要从TABLE中根据某些条件读取数据,.读取数据最常用的方法就是通过SQL语法实现的.
ABAP/4中可以利用SQL语法创建或读取TABLE,SQL语法分为DDL(DATA DEFINE LANGUAGE)语言和DML(DATA MULTIPULATION LANGUAGE)语言,DDL语言是指数据定义语言,例如CREATE等, DML语言是数据操作语言,例如SELECT, INSERT等语句. SQL 语句有OPEN SQL语句和NATIVE SQL语句. OPEN SQL语句不是标准SQL语句,是ABAP/4语言,利用OPEN SQL语句能在Databases 和 Command 之间产生一个BUFFER,所以它有一个语言转换的过程.而NATIVE SQL语句则是标准的SQL语句, 它直接针对Databases操作.
一、OPEN SQL
OPEN SQL 语句包含有: SELECT,INSERT,UPDATE,MODIFY,DELETE,OPEN CURSOR, FETCH,CLOSE CURSOR,COMMIT WORK,ROLLBACK WORK等.
1. SELECT语句
语法格式:
SELECT <result> [INTO <target>] [FROM <source>] [WHERE <condition>]
[GROUP BY <fields>] [ORDER BY <sort order>]
其中: <result>指定要抓取的字段
<target>将读取的记录存放在work area中
<source>指定从那个TABLE中读取资料
<condition>抓取资料的条件
<fields>指定按那些字段分组
<sort order>排序的字段及方式
相关的系统变量:
SY-SUBRC = 0 表示读取数据成功
<> 0 表示未找到符合条件的记录
SY-DBLNT: 被处理过的记录的笔数.
相关的命令:
EXIT. 退出循环.
CHECK <logistic statement>.如果逻辑表达式成立,则继续执行,否则,开
始下一次循环..
利用循环方式读取所有记录
SELECT ….ENDSELECT.是循环方式读取记录的.
例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MA TNR = ‘3520421700’.
<Statements>.
ENDSELECT.
(从MARD中抓取所有料号=3520421700的资料)
◆读取一笔资料
TABLES MARD.
SELECT SINGLE * FROM MARD WHERE MA TNR = ‘3520421700’.
(从MARA中抓取一笔料号=3520421700的资料)
将读取的记录放在work area中,并且加入Internal table 中.
格式有:
... INTO <work area>
... INTO CORRESPONDING FIELDS OF <work area>
... INTO (f1, ..., fn) 变量组.
... INTO TABLE <internal table>
... INTO CORRESPONDING FIELDS OF TABLE <internal table>
... APPENDING TABLE <internal table>
... APPENDING CORRESPONDING FIELDS OF TABLE <internal table>
举例一:
TABLES MARD.
DA TA: BEGIN OF ITAB OCCURS 10,
MA TNR LIKE MARD-MA TNR,
WERKS LIKE MARD-WERKS,
LGORT LIKE MARD-LGORT,
LABST LIKE MARD-LABST,
END OF ITAB.
SELECT MA TNR WERKS LGORT LABST
INTO CORRESPONDING FIELDS OF ITAB
FROM MARD
WHERE MA TNR = ‘3520421700’.
APPEND ITAB.
CLEAR ITAB.
ENDSELECT.
(将读取的结果放在Internal table ITAB中)
举例二.
TABLES MARD.
SELECT MA TNR MTART MAKTX INTO (t_matnr, t_mtart, maktx)
FROM MARD
WHERE MA TNR = ‘3520421700’.
<Statements>.
ENDSELECT.
(从MARD中抓取料号=3520421700的料号、类型和描述,放在变量t_matnr, t_mtart, maktx中)。

◆按指定的字段排序
TABLES SBOOK.
SELECT * FROM SBOOK WHERE CARRID = ‘LH’AND
CONNID = ‘0400’AND
FLDA TE = ‘19950228’
ORDER BY BOOKID [ASCENDING/DESCENDING].
WRITE: / SBOOK-BOOKID, SBOOK-CUSTOMID,
SBOOK-CUSTTYPE, SBOOK-SMOKER,
SBOOK-LUGGWEIGHT, SBOOK-WUNIT,
SBOOK-INVOICE.
ENDSELECT.
(利用参数ORDER BY所指定的字段排序)
抓取数据的条件叙述
BETWEEN <g1> AND <g2>
例如: WHERE YEAR BETWEEN 1995 AND 2000.
LIKE <g>
例如: WHERE NAME LIKE ‘MIKE%’.
(‘%’是通配符号)
IN (<g1>…<gn>)
是<g1>…<gn>里面的任意一个值即可.
例如: WHERE PLANT IN (‘CHUNGLI’, ‘TAOYUAN’,’LIUTU’).
(表示PLANT 只要是’CHUNGLI’或’TAOYUAN’或’LIUTU’都可以).
2. INSERT 语句
从work area 加入到Internal Table中
格式: INSERT INTO <database> V ALUES <work area>
例如:
DA TA: BEGIN OF W A,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF W A.
DA TA: VEN LIKE WA OCCURS 10.

WA-CODE = ‘530120’.
WA-NAME = ‘XINGDA ELECTRONICS CO.,LTD’.
INSERT INTO VEN V ALUES WA .
如果work area的名称就是internal table的名称,可以直接写成:
INSERT <internal table>
例如:
DA TA: BEGIN OF WA OCCURS 10,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF W A.

WA-CODE = ‘530120’.
WA-NAME = ‘XINGDA ELECTRONICS CO., LTD’.
INSERT W A.
从另外一个Internal table中INSERT 资料
格式:
INSERT <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICA TE KEY]
将<itab2>中非NULL的资料加入<itab1>中,加上[ACCEPTING DUPLICA TE KEY]能限制相同PRIMARY KEY不重复加入.
3.MODIFY 语法
MODIFY <internal table> [FROM <work area>].
4.DELETE 语法
DELETE <internal table> [FROM <work area>].
或: DELETE <internal table> [WHERE <conditions>]
5.DATABASE CURSOR
Database Cursor是一个数据库暂存区, 将经SELECT指令读取的记录存放至此暂存区, 再由此暂存区放至Work Area中, 可减少数据库读取的次数.
1.开启Database Cursor
语法:
OPEN CURSOR <c> FOR SELECT …WHERE <condition>
Example:
TABLES SPFLI.
DA TA: W A LIKE SPFLI,
C1 TYPE CURSOR.
OPEN CURSOR C1 FOR SELECT * FROM SPFLI
WHERE AREA =’TAIWAN’.
2.读取Database Cursor的资料存入Work Area
语法:
FETCH NEXT CURSOR <c> INTO <wa>
Example:
FETCH NEXT CURSOR C1 INTO W A.
读取下一笔Cursor位置的数据存入W A, 如果已无资料可读, SY-SUBRC <>0.
关闭Database Cursor
语法:
CLOSE CURSOR <c>
Example:
CLOSE CURSOR C1.
MIT WORK & ROLLBACK WORK
要确定资料成功写入数据库,可使用COMMIT WORK指令,如:
COMMIT WORK.
相反的, 如果反悔要复原, 可使用ROLLBACK WORK, 可复原在上个COMMIT WORK指令之后的数据, 如:
ROLLBACK WORK.
§使用NATIVE SQL指令
语法格式:
EXEC SQL [PERFORMING <form>].
<statements>
ENDEXEC.
举例一.
EXEC SQL.
CREA TE TABLE A VERI_CLNT (
CLIENT CHAR(3) NOT NULL,
ARG1 CHAR(3) NOT NULL,
ARG2 CHAR(3) NOT NULL,
FUNCTION CHAR(10) NOT NULL,
PRIMARY KEY (CLIENT, ARG1, ARG2)
)
ENDEXEC.
举例二.
DA TA: F1(3), F2(3), F3(3).
F3 = ' 1 '
EXEC SQL.
SELECT CLIENT, ARG1 INTO :F1, :F2 FROM A VERI_CLNT
WHERE ARG2 = :F3
ENDEXEC
PERFORMING <form name>的使用:
如果NA TIVE SQL的SELECT命令执行结果是抓到多笔记录,我们想要逐笔记录处理时,就用PERFORMING 参数,这个FORM能被逐次调用.如果想中止调用,就用EXIT FORM SQL结束调用.
例如:
DA TA: F1(3), F2(3), F3(3).
F3 = '010'
EXEC SQL PERFORMING WRITE_A VERI_CLNT.
SELECT CLIENT, ARG1 INTO :F1, :F2 FROM A VERI_CLNT
WHERE ARG2 = :F3
ENDEXEC.
FORM WRITE_A VERI_CLNT.
WRITE: / F1, F2.
ENDFORM.
4.经验总结
NA TIVE SQL把TABLE中的MANDT(client)字段当作一般字段使用,所以在抓取资料时必须指定特定的Client;
NA TIVE SQL中的SELECT语句没有CHECK权限的功能;
在登入SAP R/3系统时,我们已经自动与Database连接,所以在执行NA TIVE
SQL时并不需要CONNECT语句;
一条NA TIVE SQL语句可以以分号;结束,一般情况下是以句号.结束.
某些数据库系统对TABLE名字和FIELD名字有大小写区别,要正确书写.
在NA TIVE SQL中,双引号”不表示注释.。

相关文档
最新文档