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'. 數據回滾

  不會關閉游標!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM