在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游标的使用的更多相关文章

  1. ABAP游标

    DATA: BEGIN OF count_line, carrid TYPE spfli-carrid, count TYPE i, END OF count_line, spfli_tab TYPE ...

  2. ABAP开发顾问必备:SAP ABAP开发技术总结

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. [SAP ABAP开发技术总结]OPEN SQL

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. 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. ...

  5. ABAP开发顾问必备:SAP ABAP开发技术总结[转载]

    转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...

  6. 用游标实现查询当前服务器所有数据库所有表的SQL

    declare @name varchar(100) DECLARE My_Cursor CURSOR --定义游标 FOR (SELECT Name FROM Master..SysDatabase ...

  7. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...

  8. ABAP单元测试最佳实践

    本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...

  9. ABAP实现屏幕自己刷新和跳转功能

    ABAP开发工程中,有时候需要让跳转出的屏幕自动实现跳转和刷新的功能,该功能的实现需要在屏幕PBO 里面调用相应的事件执行. 关键代码为: SET TITLEBAR ' 屏幕自动程序'. IF g_c ...

随机推荐

  1. LeetCode - Two Sum

    Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...

  2. s:form标签

    2017-01-07 17:43:18 基本的用法 <!-- Action类必须有一个无参的构造器,因为在执行action方法之前,拦截器已经创建了一个"空"的Action对 ...

  3. 说说DOM的那些事儿

    引子 先来一颗栗子: <img src="/sub/123.jpg" alt="test" /> <script type="tex ...

  4. DTO – 服务实现中的核心数据

    在一个Web服务的实现中,我们常常需要访问数据库,并将从数据库中所取得的数据显示在用户页面中.这样做的一个问题是:用于在用户页面上展示的数据和从数据库中取得的数据常常具有较大区别.在这种情况下,我们常 ...

  5. 探索c#之Async、Await剖析

    阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...

  6. Chrome代码下载及编译

    2-3年前在做客户端开发时,看过CHROME的一部分代码,主要是BASE库相关的.其项目之大,编译时间之长给我留下了深刻的印象. 3年后的最近,想着再读一下其他部分的代码,所以就对其纠结的下载和编译过 ...

  7. iOS实现UITableViewDataSource与Controller的分离

    写在前面 在之前的项目中好多处用到了tableView,然而之前不懂得将代理方法实现分离,所以每在一处用到tableView就要在controller中写一遍UITableViewDataSource ...

  8. linux下select/poll/epoll机制的比较

    select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...

  9. salesforce 零基础学习(六十)Wizard样式创建数据

    项目中表之间关联关系特别多,比如三个表中A,B,C  C作为主表,A,B作为从表,有时候C表需要创建数据时,同时需要创建A,B两个表的数据,这种情况下,使用Wizard样式会更加友好. 以Goods_ ...

  10. Matlab 利用参数方程绘制空心球体

    基本原理: 实质为利用球面参数方程,利用网格化数据绘制 x=R*sin(theta)*cos(phi) y=R*sin(theta)*sin(phi) z=R*cos(theta) 绘制函数: fun ...