平时在 ‘ 工地搬砖 ’,很少关注基础技能,闲来无事,拿起来复习一下 !
实际在项目中用到的非常之少,所以说学编程,先学框架,在学细节 !,因为细节太多,学不完 !
做JAVA的朋友们,现在项目上基本上用Mybtis , 早几年用Hibernate框架,现在几乎没有用JDBC直接操作数据库。
ABAP领域定义的CRUD,也没有什么特别之处,和SQL语句大致一样 !
如果说用 ‘CRUD’ 的样式 ,过完这一辈子,朋友们都会有哪些感想呢 ?
1 开放式SQL
(1)SY-SUBRC ,SQL操作是否成功
(2)SY-DBCNT ,影响行数
2 读取数据
SELECT <result> FROM <source> [INTO <target>] [WHERE <condition>]
[GROUP BY <fields>] [ORDER BY <sort_order>].
实战中的案例,别看语法,看例子:
SELECT
mara~zwlcms,
mara~matnr, "物料描述
mara~mtart, "物料类型
mara~meins, "单位
marc~werks,
marc~ekgrp,
marc~dismm,
marc~dispo,
marc~sfcpf,
marc~fevor,
mvke~vkorg, "销售组织
mbew~vprsv, "价格控制
mbew~mlast "物料价格确定: 控制
INTO CORRESPONDING FIELDS OF TABLE @gt_data
FROM mara
LEFT JOIN marc ON marc~matnr = mara~matnr
LEFT JOIN mvke ON mvke~matnr = mara~matnr AND mvke~dwerk = marc~werks
LEFT JOIN mbew ON mbew~matnr = mara~matnr AND mbew~bwkey = marc~werks
WHERE
mara~matnr IN @so_matnr
AND marc~werks IN @so_werks
.
定义选择结果 SELECT
(1)选择多行中的所有数据 :SELECT [DISTINCT] * ............ENDSELECT.
(2)选择单行中的所有数据:SELECT SINGLE [FOR UPDATE] * ....... WHERE <condition> ......
(3)选择指定列中的所有数据:SELECT [SINGLE [FOR UPDATE]] [DISTINCT] <s1><s2> .....
指定数据表 FROM
(1)在程序中指定数据库表:...... FROM <dbtab> [CLIENT SPECIFIED] [BYPASSING BUFFER]
[UP TO <n> ROWS].........
CLIENT SPECIFIED 选项用于关闭自动集团处理,
BYPASSING BUFFER 选项使得不用读取 SAP 表缓冲区就可直接读取数据库。
(2)在运行时指定数据库表
......FROM (<dbtabname>) [CLIENT SPECIFIED] [BYPASSING BUFFER]
[UP TO <n> ROWS].. INTO <target> .....
该格式的 FROM 子句只能与 INTO 子句一起使用。
指定目标区 INTO
(1)将数据读到工作区 SELECT ... INTO <wa> ............
(2)将数据读到内表 SELECT .....INTO TABLE <itab>.
(3)将数据读到预定义包大小的内表 SELECT * .....INTO TABLE <itab> PACKAGE SIZE <n>.....
(4)将数据行附加到内表中 SELECT ..... APPENDING TABLE <itab>.....
(5)逐个组件的读取数据
SELECT ... INTO CORRESPONDING FIELDS OF <wa> ........
SELECT ... INTO CORRESPONDING FIELDS OF TABLE <itab> ........
SELECT ... APPENDING CORRESPONDING FIELDS OF TABLE <itab> ........
选择读取行 WHERE
(1)在程序中为行选择指定条件 ..... WHERE <condition> ........
(2)使用逻辑链接操作符组合条件
3 添加数据
添加单一行 INSERT INTO <dbtab> [CLIENT SPECIFIED] VALUES <wa>.
添加多行
INSERT <dbtab> [CLIENT SPECIFIED] FROM TABLE <itab> [ACCEPTING DUPLICATE KEYS].
4 更新数据
更新单一行
UPDATE <dbtab> [CLIENT SPECIFIED] FROM <wa>. 工作区<wa>中的内容将覆盖数据库表<dbtab>的行,
该数据库表与<wa>具有相同的主码。
没有指定工作区<wa>。
但表工作区<dbtab>中的内容将覆盖具有相同主码的数据库表的行。
UPDATE <dbtab> [CLIENT SPECIFIED].
更新多行
UPDATE <dbtab> [CLIENT SPECIFIED] SET <S1> ..<Sn> [WHERE <condition>].
使用内表更新多行
UPDATE <dbtab> [CLIENT SPECIFIED] FROM TABLE <itab>.
UPDATE (<dbtabname>) [CLIENT SPECIFIED] FROM TABLE <itab>.
5 添加或更改数据
插入单行
MODIFY <dbtab> [CLIENT SPECIFIED] [FROM <wa>].
MODIFY (<dbtabname>) [CLIENT SPECIFIED] [FROM <wa>].
插入多行
MODIFY <dbtab> [CLIENT SPECIFIED] FROM TABLE <itab>.
MODIFY (<dbtabname>) [CLIENT SPECIFIED] FROM TABLE <itab>.
6 删除数据
删除单行
DELETE <dbtab> [CLIENT SPECIFIED] FROM <wa>.
DELETE <dbtab> [CLIENT SPECIFIED].
删除多行
DELETE FROM <dbtab> [CLIENT SPECIFIED] WHERE <conditions>.
DELETE FROM (<dbtabname>) [CLIENT SPECIFIED] WHERE <conditions>.
使用内表删除多行
DELETE <dbtab> [CLIENT SPECIFIED] FROM TABLE <itab>.
DELETE (<dbtabname>) [CLIENT SPECIFIED] FROM TABLE <itab>.
7 使用光标读取数据 ,
非常像ORACLE 的游标
打开光标
OPEN CURSOR [WITH HOLD] <c> FOR SELECT ........ [WHERE <conditions>].
用光标读取数据
FETCH NEXT CURSOR <c> INTO <target>.
关闭光标
CLOSE CURSOR <c>.
下列情况将自动关闭光标:
1)执行 COMMIT WORK 或 ROLLBACK WORK 语句时;
2)当执行自身的 SQL 数据库提交或取消时;
3)更改屏幕时;
4)执行远程功能调用时。
如果在 OPEN CURSOR 语句中使用 WITH HOLD 选项,
自身的 SQL 中的数据库提交将不会关闭光标。
8 数据簇
向内存中存储数据对象
EXPORT <f1> [FROM <g1>] <f2> [FROM <g2>] ... TO MEMORY ID <key>.
从内存中读取数据对象
IMPORT <f1> [TO <g1>] <f2> [TO <g2>] ... FROM MEMORY ID <key>.
删除内存中的数据簇
FREE MEMORY [ID <key>].
如果不附加 ID <key>,则此语句删除整个内存。
包括此前用 EXPORT 存储到 ABAP/4 内存中的所有数据簇。
附加 ID <key>之后,该语句只删除用此名称命名的数据簇。
因为删除整个内存会导致任何系统例程内存内容的丢失,所以应只使用附加有 ID 的 FREE MEMORY 语句。