zoukankan      html  css  js  c++  java
  • 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(1) TYPE c,
          flag2(1) 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 <> 0.
          "当没数据时就关闭游标
          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 <> 0.
          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 0.
            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 0.
        CALL FUNCTION 'DB_COMMIT'.
    *    WRITE: '第',sy-index,'批,执行成功'.
      ELSE.
        CALL FUNCTION 'DB_ROLLBACK'.
        WRITE: / '',sy-index,'批,',lv_mes,'失败'.
      ENDIF.
    ENDDO.
    CLOSE CURSOR lv_cursor.
    View Code

    注意:当使用

        CALL FUNCTION 'DB_COMMIT'.  数据提交

      CALL FUNCTION 'DB_ROLLBACK'. 数据回滚

      不会关闭游标!

  • 相关阅读:
    Python父类调用子类
    Python中for else注意事项
    JS Number类型数字位数及IEEE754标准
    cocos打包到ios与android上音频推荐
    JS学习之预解析(执行上下文)
    JS学习之函数的作用域
    JS学习之函数二
    JS学习之函数
    如何在subline中高亮显示.vue文件
    JS之正则
  • 原文地址:https://www.cnblogs.com/ruingy/p/6112454.html
Copyright © 2011-2022 走看看