OPEN SQL簡介

    OPEN SQL 語句包含有: SELECT,INSERT,UPDATE,MODIFY,DELETE,OPEN CURSOR, FETCH,CLOSE CURSOR,COMMIT WORK,ROLLBACK WORK等.

1.    SELECT語句

語法格式:
SELECT <result> [INTO <target>] [FROM <source>] [WHERE <condition>]
                 [GROUP BY <fields>] [ORDER BY <sort order>]
其中: <result>指定要抓取的字段
        <target>將讀取的記錄存放在work area中
        <source>指定從那個TABLE中讀取資料
        <condition>抓取資料的條件
        <fields>指定按那些字段分組
        <sort order>排序的字段及方式
相關的系統變量:
       SY-SUBRC = 0    表示讀取數據成功
                 <> 0 表示未找到符合條件的記錄
       SY-DBLNT: 被處理過的記錄的筆數.
相關的命令:
       EXIT. 退出循環.
       CHECK <logistic statement>.如果邏輯表達式成立,則繼續執行,否則,開
                              始下一次循環.
◆ .利用循環方式讀取所有記錄
SELECT ….ENDSELECT.是循環方式讀取記錄的.
       例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = ‘3520421700’.
      <Statements>.
ENDSELECT.
(從MARD中抓取所有料號=3520421700的資料)
◆讀取一筆資料
TABLES MARD.
SELECT SINGLE * FROM MARD WHERE MATNR = ‘3520421700’.
(從MARA中抓取一筆料號=3520421700的資料)
◆ 將讀取的記錄放在work area中,並且加入Internal table 中.
格式有:
     ... INTO <work area>
     ... INTO CORRESPONDING FIELDS OF <work area>
     ... INTO (f1, ..., fn) 變量組.
     ... INTO TABLE <internal table>
     ... INTO CORRESPONDING FIELDS OF TABLE <internal table>
     ... APPENDING TABLE <internal table>
     ... APPENDING CORRESPONDING FIELDS OF TABLE <internal table>
舉例一:
TABLES MARD.
DATA:    BEGIN OF ITAB OCCURS 10,
                MATNR LIKE MARD-MATNR,
                WERKS LIKE MARD-WERKS,
                LGORT LIKE MARD-LGORT,
                LABST LIKE MARD-LABST,
          END OF ITAB.
SELECT MATNR WERKS LGORT LABST  
                INTO CORRESPONDING FIELDS OF ITAB
                FROM MARD
                WHERE MATNR = ‘3520421700’.
         APPEND ITAB.
         CLEAR ITAB.
ENDSELECT.
(將讀取的結果放在Internal table ITAB中)
舉例二.
TABLES MARD.
SELECT MATNR    MTART    MAKTX    INTO (t_matnr, t_mtart, maktx)
                 FROM MARD
                 WHERE MATNR = ‘3520421700’.
         <Statements>.
ENDSELECT.
(從MARD中抓取料號=3520421700的料號、類型和描述,放在變量t_matnr, t_mtart, maktx中)。
◆按指定的字段排序
TABLES SBOOK.
SELECT * FROM SBOOK     WHERE CARRID = ‘LH’ AND
                                   CONNID = ‘0400’ AND
                                   FLDATE = ‘19950228’
              ORDER BY BOOKID [ASCENDING/DESCENDING].
     WRITE: / SBOOK-BOOKID,     SBOOK-CUSTOMID,
             SBOOK-CUSTTYPE,    SBOOK-SMOKER,
             SBOOK-LUGGWEIGHT, SBOOK-WUNIT,
             SBOOK-INVOICE.
ENDSELECT.
(利用參數ORDER BY所指定的字段排序)
◆ 抓取數據的條件敘述
(1) BETWEEN <g1>    AND    <g2>
例如:    WHERE YEAR BETWEEN 1995 AND 2000.
(2) LIKE <g>
例如:    WHERE NAME LIKE ‘MIKE%’.
(‘%’是通配符號)
(3) IN (<g1>…<gn>)
是<g1>…<gn>裏面的任意一個值即可.
例如: WHERE PLANT IN (‘CHUNGLI’, ‘TAOYUAN’,’LIUTU’).
(表示PLANT 只要是’CHUNGLI’或’TAOYUAN’或’LIUTU’都可以).

2. INSERT 語句

◆ 從work area 加入到Internal Table中
格式: INSERT INTO <database> VALUES <work area>
例如:
DATA:    BEGIN OF WA,
                CODE(6) TYPE C,
                NAME(30) TYPE C,
          END OF WA.
DATA:    VEN LIKE WA OCCURS 10.

WA-CODE    =    ‘530120’.
WA-NAME    =    ‘XINGDA ELECTRONICS CO.,LTD’.
INSERT INTO VEN VALUES WA .
如果work area的名稱就是internal table的名稱,可以直接寫成:
        INSERT <internal table>
例如:
DATA:    BEGIN OF WA OCCURS 10,
                CODE(6) TYPE C,
                NAME(30) TYPE C,
          END OF WA.

WA-CODE = ‘530120’.
WA-NAME    =    ‘XINGDA ELECTRONICS CO., LTD’.
INSERT WA.
◆ 從另外一個Internal table中INSERT 資料
格式:
INSERT <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICATE KEY]
將<itab2>中非NULL的資料加入<itab1>中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重複加入.

3. MODIFY 語法
MODIFY <internal table> [FROM <work area>].

4. DELETE 語法

       DELETE <internal table> [FROM <work area>].
      或: DELETE <internal table> [WHERE <conditions>]

5. DATABASE CURSOR

     Database Cursor是一個數據庫暫存區, 將經SELECT指令讀取的記錄存放至此暫存區, 再由此暫存區放至Work Area中, 可減少數據庫讀取的次數.
1.開啓 Database Cursor
    語法:
          OPEN    CURSOR    <c>    FOR    SELECT …    WHERE <condition>
          Example:
                  TABLES    SPFLI.
                  DATA:    WA    LIKE    SPFLI,
                          C1    TYPE    CURSOR.
                  OPEN    CURSOR    C1 FOR SELECT    *    FROM    SPFLI
                         WHERE    AREA =’TAIWAN’.
    2.讀取 Database Cursor的資料存入 Work Area
語法:
        FETCH    NEXT    CURSOR    <c>    INTO    <wa>
            Example:
                     FETCH    NEXT    CURSOR    C1    INTO    WA.
    讀取下一筆Cursor位置的數據存入WA, 如果已無資料可讀, SY-SUBRC <>0.
關閉 Database Cursor
語法:
        CLOSE    CURSOR    <c>
        Example:
                 CLOSE    CURSOR    C1.

6.    COMMIT WORK & ROLLBACK WORK

要確定資料成功寫入數據庫,可使用COMMIT WORK指令,如:
     COMMIT    WORK.
相反的, 如果反悔要復原, 可使用 ROLLBACK    WORK, 可復原在上個COMMIT WORK指令之後的數據, 如:
     ROLLBACK    WORK.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章