ABAP游标的使用
在Oracle,SQLServer中游标的使用是经常的,所以在ABAP不懂是不行的......
1、声明游标
OPEN CURSOR [WITH HOLD] <c> FOR SELECT <result>
FROM <source>
[WHERE <condition>]
[GROUP BY <fields>]
[HAVING <cond>]
[ORDER BY <fields>].
cursor <c>需事先在data语句中声明变量,在句型中可见,基本上select使用的所有附加项都可使用,除了一个,single
2、操作游标
向下移动游标:FETCH NEXT CURSOR <c> INTO <target>.
关闭游标:CLOSE CURSOR c1.
如:FETCH NEXT CURSOR S_CURSOR into TABLE itab PACKAGE SIZE S_S_IF-MAXSIZE.
FETCH NEXT CURSOR s_cursor into wa.
REPORT ydemo_rick_4. DATA: c1 TYPE cursor, "声明游标
c2 TYPE cursor. DATA: wa1 TYPE spfli,
wa2 TYPE spfli. DATA: flag1() TYPE c,
flag2() TYPE c. OPEN CURSOR: c1 FOR SELECT carrid connid
FROM spfli
WHERE carrid = 'LH', c2 FOR SELECT carrid connid cityfrom cityto
FROM spfli
WHERE carrid = 'AZ'.
DO.
IF flag1 NE 'X'.
FETCH NEXT CURSOR c1 INTO CORRESPONDING FIELDS OF wa1. "放到一个工作区中
IF sy-subrc <> .
"当没数据时就关闭游标
CLOSE CURSOR c1.
flag1 = 'X'.
ELSE.
WRITE: / wa1-carrid, wa1-connid.
ENDIF.
ENDIF. IF flag2 NE 'X'.
FETCH NEXT CURSOR c2 INTO CORRESPONDING FIELDS OF wa2.
IF sy-subrc <> .
CLOSE CURSOR c2.
flag2 = 'X'.
ELSE.
WRITE: / wa2-carrid, wa2-connid,
wa2-cityfrom, wa2-cityto.
ENDIF.
ENDIF.
IF flag1 = 'X' AND flag2 = 'X'.
EXIT.
ENDIF. ENDDO.
下几种情况游标会知动关闭
第一、执行commit work和rollback work时。
第二、当执行OpenSql数据库提交或取消时。
第三、更改屏幕。
另,如果在open cursor时用了with hold, openSql在向数据库提交时游标不会自动关闭。
--------------------------------------------------------------------------------------------
动态操作数据表的游标使用:
REPORT zles_tab_op_job.
FIELD-SYMBOLS: <gs_fs>,<gt_fs> TYPE STANDARD TABLE."动态工作区,內表字段符号
DATA: gs_ref TYPE REF TO data, "动态工作区,內表引用
gt_ref TYPE REF TO data.
DATA: lv_cursor TYPE cursor,
lv_mes TYPE char20.
DATA: lr_execption TYPE REF TO cx_root,
lv_error TYPE string. PARAMETERS: p_tab TYPE tabname,
p_sql TYPE string,
p_num TYPE i,
p_mode. CREATE DATA gt_ref TYPE TABLE OF (p_tab).
ASSIGN gt_ref->* TO <gt_fs>.
CREATE DATA gs_ref LIKE LINE OF <gt_fs>.
ASSIGN gs_ref->* TO <gs_fs>. OPEN CURSOR WITH HOLD lv_cursor
FOR
SELECT * FROM (p_tab)
WHERE (p_sql).
DO.
CLEAR <gt_fs>.
TRY .
FETCH NEXT CURSOR lv_cursor
INTO TABLE <gt_fs> PACKAGE SIZE p_num.
IF sy-subrc NE .
CLOSE CURSOR lv_cursor.
EXIT.
ENDIF.
CATCH cx_sy_open_sql_db
INTO lr_execption.
lv_error = lr_execption->get_text( ).
IF lv_error IS NOT INITIAL.
MESSAGE e000(oo) WITH lv_error.
ENDIF.
ENDTRY. CLEAR lv_mes.
CASE p_mode.
WHEN 'I'.
INSERT (p_tab) FROM TABLE <gt_fs>.
lv_mes = '插入'.
WHEN 'D'.
DELETE (p_tab) FROM TABLE <gt_fs>.
lv_mes = '删除'.
WHEN 'M'.
MODIFY (p_tab) FROM TABLE <gt_fs>.
lv_mes = '修改'.
WHEN 'U'.
UPDATE (p_tab) FROM TABLE <gt_fs>.
lv_mes = '更新'.
* WHEN gs_9000-query.
* PERFORM frm_alv_display."ALV查询
ENDCASE.
IF sy-subrc EQ .
CALL FUNCTION 'DB_COMMIT'.
* WRITE: '第',sy-index,'批,执行成功'.
ELSE.
CALL FUNCTION 'DB_ROLLBACK'.
WRITE: / '第',sy-index,'批,',lv_mes,'失败'.
ENDIF.
ENDDO.
CLOSE CURSOR lv_cursor.
注意:当使用
CALL FUNCTION 'DB_COMMIT'. 数据提交
CALL FUNCTION 'DB_ROLLBACK'. 数据回滚
不会关闭游标!
ABAP游标的使用的更多相关文章
- ABAP游标
DATA: BEGIN OF count_line, carrid TYPE spfli-carrid, count TYPE i, END OF count_line, spfli_tab TYPE ...
- ABAP开发顾问必备:SAP ABAP开发技术总结
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]OPEN SQL
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ABAP技术总结
SAP ——ABAP/4 技术总结 V3.0 2014-10-14 --江正军 1. 1.1. 1.1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.7.1. 1.7.2. ...
- ABAP开发顾问必备:SAP ABAP开发技术总结[转载]
转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...
- 用游标实现查询当前服务器所有数据库所有表的SQL
declare @name varchar(100) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT Name FROM Master..SysDatabase ...
- 使用rowid抽取数据方法以及大数据量游标卡住的应对
平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...
- ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...
- ABAP实现屏幕自己刷新和跳转功能
ABAP开发工程中,有时候需要让跳转出的屏幕自动实现跳转和刷新的功能,该功能的实现需要在屏幕PBO 里面调用相应的事件执行. 关键代码为: SET TITLEBAR ' 屏幕自动程序'. IF g_c ...
随机推荐
- Linux-Rhel6 恢复误删文件
需要工具extundelete(可通过xshell上传下载到linux)知识点:ifconifig eth0 查看ipfdisk /dev/sda 管理磁盘m ...
- C 盘的不速之客
C 盘的报告内容既然上GB的空间 操作系统版本 原来是微软这个查找解决异常关闭解决方案生成的报告 参考 How To Disable Vista Error Reporting Feature ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
- Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II
题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...
- 相关query挖掘
1.何为相关query 我通常也把相关query称为相似query,搜索日志中一个用户在短时间内的一系列搜索词被称为相关query.相关就是两个query间有一定的关系,反映了用户在当时的需求.本文就 ...
- Win下必备利器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
- Atitit smb网络邻居原理与实现查询列表
Atitit smb网络邻居原理与实现查询列表 1.1. SAMBA的起源1 1.2. Smb是否依赖unpn SSDP ,还是使用扫描遍历0-255发现原理1 2. SMB共享不成功原因分享(WI ...
- 【.net 深呼吸】自定义缓存配置(非Web项目)
在前一篇烂文中,老周简单讲述了非Web应用的缓存技术的基本用法.其实嘛,使用系统默认方案已经满足我们的需求了,不过,如果你真想自己来配置缓存,也是可以的. 缓存的自定义配置可以有两种方案,一种是用代码 ...
- Ubuntu 14.04 中 安装elasticsearch2.*+logstash2.*+kibana
在Ubuntu 14.04 上安装单机版ELK 2.*(脚本化) 1.判断是否为root权限 if [ "${UID}" -ne 0 ]; then echo "You ...
- 难道.NET Core到R2连中文编码都不支持吗?
今天写了一个简单的.NET Core RC2控制台程序,发现中文显示一直是乱码.查看操作系统设置,没有问题:查看源文件编码,也没有问题:甚至查看了Console字符编码相关的注册表,依然没有发现问题. ...