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.

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/shin_zhong/archive/2009/09/18/4568358.aspx

<think>嗯,用户问的是Open SQL是什么,我需要先理解这个概念。首先,我回忆一下,Open SQL应该和SAP系统有关吧。因为之前学ABAP的时候有提到过,Open SQL是ABAP语言中用来操作数据库的一种方式。那具体来说,Open SQL有什么特点呢? 记得Open SQL是ABAP的一部分,它允许开发者用统一的语法来操作数据库,而不用关心底层数据库的具体类型,比如SAP HANA、Oracle或者SQL Server。这样的话,代码的可移植性更好,对吧?因为无论底层数据库怎么换,Open SQL语句不需要大改。 然后,Open SQL和Native SQL有什么区别呢?Native SQL应该是直接使用特定数据库SQL语法,这样虽然能利用数据库特有功能,但移植性差。而Open SQL是SAP抽象出来的,统一接口,可能不支持某些高级或特定的功能,但保证了跨数据库的兼容性。 接下来,Open SQL的常见操作应该包括SELECT、INSERT、UPDATE、DELETE这些基本的DML语句。比如SELECT语句可以从数据库表中读取数据,可能还支持一些聚合函数、JOIN操作之类的。但要注意,ABAP的Open SQL可能和标准SQL有些语法差异,比如语句的结构或者关键字的位置。 另外,Open SQL在性能优化方面有没有特别的地方?比如SAP可能会对Open SQL进行一些优化,或者有缓冲区机制,减少直接访问数据库的次数,提高效率。比如TABLE BUFFER这样的概念,可能用到了缓存,这样频繁读取的时候更快。 还要考虑安全性和权限控制,Open SQL是否自动处理了SQL注入的问题,或者需要开发者自己注意?可能SAP在这方面有内置的防护措施,比如参数化查询的支持,防止恶意输入。 不过用户可能想知道更详细的定义、用途、优势和限制。比如,使用Open SQL的好处是代码可移植、简化开发、性能优化;限制可能是无法使用某些数据库特有的功能,或者复杂的查询可能不如Native SQL灵活。 另外,有没有具体的例子?比如一个简单的SELECT语句Open SQL怎么写,和标准SQL有什么区别。比如在ABAP中,可能需要用SELECT ... FROM ... INTO TABLE ... WHERE这样的结构,而标准SQL可能是SELECT * FROM ... WHERE ...。 还要提到Open SQL在SAP系统中的位置,比如属于ABAP语言的核心部分,用于开发应用模块,如FI、CO、SD等,这些模块的数据操作都依赖于Open SQL。 可能用户是刚开始学习ABAP或者SAP开发,需要了解基础概念,或者在做项目时遇到了相关问题,想知道如何正确使用Open SQL。需要确保回答结构清晰,分点说明,可能包括定义、特点、与Native SQL的对比、语法示例、优缺点等。 最后,检查是否有错误,比如语法是否正确,比如Open SQL是否真的支持JOIN,或者是否有其他限制。可能需要确认一下ABAP版本的不同对Open SQL的支持情况,比如新版本是否支持更多标准SQL特性。</think>Open SQL 是 SAP ABAP 语言中用于数据库操作的核心技术,以下是逐步解析: --- ### 一、**定义与定位** 1. **基本概念** Open SQL 是 ABAP 语言的一部分,提供**统一语法**对数据库进行增删改查(CRUD)操作。 - **抽象层特性**:屏蔽底层数据库差异(如 SAP HANA、Oracle、SQL Server),开发者无需关注具体数据库类型。 2. **应用场景** - 主要用于 SAP 模块开发(如 FI、SD、MM)中处理业务数据。 - 支持事务控制(如 `COMMIT WORK`、`ROLLBACK WORK`)。 --- ### 二、**核心特点** 1. **跨数据库兼容性** - 同一段 Open SQL 代码可在不同数据库上运行,无需修改。 - *示例*:`SELECT * FROM sflight INTO TABLE @itab` 适配所有 SAP 支持的数据库。 2. **语法简化与增强** - 语法接近标准 SQL,但包含 ABAP 特有扩展。 - *关键扩展*: - 使用 `@` 符号引用 ABAP 变量(如 `WHERE carrid = @lv_carrid`)。 - 直接操作内表(Internal Table),如 `INSERT ztable FROM TABLE itab`。 3. **性能优化机制** - **缓冲层(Table Buffer)**:自动缓存常用表(如配置表),减少数据库访问。 - **批量操作**:支持内表批量插入/更新(如 `MODIFY ztable FROM TABLE itab`)。 --- ### 三、**与 Native SQL 的对比** | **特性** | **Open SQL** | **Native SQL** | |------------------|---------------------------------------|-------------------------------------| | 可移植性 | ✅ 跨数据库兼容 | ❌ 依赖特定数据库语法 | | 功能覆盖 | ❗ 受限(如不支持存储过程调用) | ✅ 支持数据库全部功能 | | 安全性 | ✅ 自动防 SQL 注入 | ❗ 需手动处理输入校验 | | 性能调优 | ✅ SAP 自动优化(如缓冲) | ✅ 可手动编写高效 SQL | --- ### 四、**语法示例** 1. **查询数据** ```abap SELECT carrid, connid, fldate FROM sflight INTO TABLE @DATA(it_flights) WHERE carrid = 'LH' AND seatsmax > 0. ``` 2. **插入数据** ```abap DATA(ls_flight) = VALUE sflight( carrid = 'AA', connid = '0017', ... ). INSERT INTO sflight VALUES @ls_flight. ``` 3. **更新数据** ```abap UPDATE sflight SET price = price * 1.1 WHERE carrid = 'LH'. ``` --- ### 五、**优缺点分析** - **优势** - 代码可移植性强,降低维护成本。 - 集成 SAP 权限检查和缓冲机制,提升安全性与性能。 - **局限性** - 不支持数据库高级功能(如 Oracle 的递归查询 `CONNECT BY`)。 - 复杂查询需通过 JOIN 或子查询实现,可能不如 Native SQL 灵活。 --- ### 六、**最佳实践** 1. **优先使用 Open SQL**,除非需调用数据库特有功能。 2. **避免在循环中执行单条 SQL**,改用批量操作。 3. 利用 `EXPLAIN` 工具分析 SQL 执行计划(部分数据库支持)。 通过 Open SQL,SAP 开发者能以高效、安全的方式操作数据库,同时保持代码的跨平台兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值