SAP ABAP openSQL数据库操作

本篇主要讲解openSQL的基础内容

SAP ABAP openSQL数据库操作(二)
SAP ABAP openSQL数据库操作(三)
SAP ABAP openSQL数据库操作(四)

文章目录

  • 1.数据库基础
    • 1.1 SQL数据库操作
    • 1.2 注意效率问题
  • 2.数据表维护
    • 2.1 字段表
    • 2.2 外部关键字
    • 2.3 技术设定
    • 2.4 索引
  • 3. 提取数据
    • 3.1 SELECT
    • 3.2 选择单行数据
    • 3.3 选择多行数据
    • 3.4 指定条件查询

1.数据库基础

1.1 SQL数据库操作

  1. 数据定义(DDL):定义数据库的逻辑结构,创建和管理数据库.
  2. 数据库操纵(DML):主要包括数据的更新和查询量大操作.
  3. 数据控制(DCL):用于权限,数据安全控制和数据操作的一致性检查.
    在SAP abap中支持两种SQL语言,native SQL 和openSQL
    SAP ABAP openSQL数据库操作_第1张图片
    openSQL完全集成到abap语言中的标准SQL子集,当我们在编写openSQL时,会通过SAP数据库管理系统的接口自动识别不同的数据库.

1.2 注意效率问题

  1. 尽可能减少满足条件的数据条目数量,因为在数据查询的过程中,所有满足条目的数据将通过网络从数据库服务器中加载到应用服务器内存中去.
  2. 减少传输的数据,减少网络流量
  3. 减少访问的数据库表的数量,该原则实现主要依赖于底层数据库的设计优化
  4. 减少查询的难度,可以通过整理选择标标准来实现.
  5. 减少数据库负载,因为底层数据库可能需要同时支持多个应用服务器

2.数据表维护

因为SAP系统中关系数据库表的创建和维护主要是通过数据字典.

2.1 字段表

数据表的行结构是各个字段作为组件构成的,必须在数据字段中定义的数据元素,结构体或者表等数据类型.

  1. 字段名
  2. 关键字
  3. 字段类型
  4. 字段长度
  5. 小数位
  6. 说明文字

2.2 外部关键字

用于定义数据库表之间的关系或实现数据表字段的输入值检查,还可以用于将几个数据表链接为一个视图或者锁定对象.
SAP ABAP openSQL数据库操作_第2张图片
F2和F5,F4和F6 可以理解为是相同结构的,当我们在插入数据的时候必须同时插入T1 T2 所对应的外键字段,要不然会插入失败的.

2.3 技术设定

技术设定可以理解为为数据库表附加的功能,比如说:是否要进行缓冲日志等.
SAP ABAP openSQL数据库操作_第3张图片

数据库表的缓冲机制,有点类似有Redis的作用.
缓冲机制有三种:

  1. FULL
  2. SINGLE-RECORD
  3. GENERIC

缓冲机制的意义就在于把首次查询的数据放在数据库的应用服务器缓冲区中,的那个下次再次查询的时候可以直接获取缓冲区中的数据,从而可以降低数据库的查询压力.
同时要注意缓冲区和数据库要保持一致性.以避免幻读脏读等情况.
LOG DATA CHANGES设定表中的数据修改是否需要在日志中被记录.

2.4 索引

可以看做一个仅包含部分字段的数据库表拷贝,而且数据已排序.索引包含指向实际数据表条目的指针,因而索引中不包含的字段也可以被快速访问.
一个数据库表可以包含一个主键和多个附属索引,主键包含表关键字和指向整个条目的指针,有系统自动生成并添加到数据库中.

SAP ABAP openSQL数据库操作_第4张图片
索引的工作方式:
将关键字段排序存储.然后使用指针寻址真正的数据行.

3. 提取数据

3.1 SELECT

在查询数据前首先要明白的问题:

  1. 要读取那些数据
  2. 从那个表中读
  3. 要读到那个工作区
  4. 需要什么条件

基本SELECT结构

SELECT select_clause
FROM   from_clause
INTO   into_clause
WHERE where_clause .

除了上面的基本结构外还可以添加
GROUP BY 分组
HAAVING 分组条件
ORDER BY 排序(默认升序)

SELECT select_clause
FROM  from_tab
INTO into_tab
WHERE where_clause
GROUP BY fieldcat
HAVING condition
ORDER BY fieldcat.

3.2 选择单行数据

如果只取一个数据行

SELECT SINGLE <result> 
INTO <target>
FROM <source>. 

1.选择全部字段

DATA wa_spfli TYPE   spfli.

SELECT * FROM spfli
INTO wa_spfli
WHERE cityfrom = 'SINGAPORE' 
	AND cityto = 'SAN FRANCISCO'.

WRITE : / wa_spfli-cityfrom,wa_spfli-cityto.

2.单行选择指定字段
select后面的字段要和into后面的字段顺序一致

DATA wa_carrid TYPE spfli-carrid.
DATA wa_connid TYPE spfli-connid.

SELECT SINGLE carrid connid
  FROM spfli
  INTO (wa_carrid,wa_connid)
 WHERE cityfrom = 'SINGAPORE'
  AND cityto = 'SAN FRANCISCO'.

WRITE : / wa_carrid, wa_connid.

3.选择相关字段
如果你不能保证读取到的数据和你内表中的数据顺序字段是一致的可以使用CORRESPONDING FIELDS OF [TABLE]

SELECT SINGLE carrid connid
  FROM spfli
  INTO CORRESPONDING FIELDS OF wa_spfli
  WHERE cityfrom = 'SINGAPORE'
  AND cityto = 'SAN FRANCISCO'.

3.3 选择多行数据

1.循环结构查询语法

SELECT [distinct] <result>..
	<statement block>
ENDSELECT.

示例:

SELECT   * FROM spfli
  INTO wa_spfli
 WHERE cityfrom = 'SINGAPORE'
  AND cityto = 'SAN FRANCISCO'.

  WRITE: / wa_spfli-carrid.
ENDSELECT.

2.选择到内表
语法:

SELECT * INTO|APPENDING 
[CORRESPONDING FIELDS OF] TABLE itab

INTO会将原有的内表数据覆盖
APPENDING不会覆盖原有的内表数据,而是在原有的内表后面添加数据.

TYPES: BEGIN OF tab_type,
  carrid TYPE spfli-carrid,
  connid TYPE spfli-connid,
  END OF tab_type.
DATA: spfli_tab1 TYPE TABLE OF spfli,
      spfli_tab2 TYPE TABLE OF tab_type.

*选择符合条件的整行数据,内表的结构和数据库表的结构是相同的
SELECT * FROM spfli
  INTO TABLE spfli_tab1
  WHERE cityfrom = 'SINGAPORE'
  AND cityto = 'SAN FRANCISCO'.

*只把内表中有的字段进行输出  
SELECT cityfrom cityto
  FROM spfli 
  INTO CORRESPONDING FIELDS OF TABLE spfli_tab2
  WHERE cityfrom = 'SINGAPORE'
  AND cityto = 'SAN FRANCISCO'.

3.指定选择包大小
举个例子:我有12本书,一个书包(容量:3本),现在用书包把书从学校拿回家.12/3=4

如果n<=0 运行时错误

SELECT * INTO TABLE itab PACKAGE SIZE n
	<statement block>
ENDSELECT.

3.4 指定条件查询

1.比较运算符

= < > <= >=  <>
WHERE  f = 'a'.

2.范围限定运算符

*字段f处于或不处于字段g和c之间才符合
WHERE  f [NOT] BERWEEN g AND c.

3.字符比较运算符

*使用like运算符进行模式化的比较
WHERE f [NOT] LIKE g [BSCAPE h].
*字段f的值必须或不必须符合g的模式,下划线表示一个字符,百分号表示诺干个字符(模糊查询)
WHERE f city LIKE '%town%'.

4.检查列表值
是否满足或不满足括号中的一个值

WHERE f [NOT] IN (g,c,a,s).

5.检查空值
IS NULL字段值是否为空,如果为null表示该字段下没有数据,但在数据字典中一般不会存在null,因为都会有初始值.
如果使用native SQL进行空值设定,可能会出现空值现象,但abap也会将其字段进行初始化值.

WHERE f IS [NOT] NULL.

6.检查选择表
选择表是一种复杂而强大的逻辑表达式组合形式,其本身是一个内表,检查选择表意味着数据库字段需要满足所有逻辑板表达式的组合.

*选择code等于 9900 且不等于 USA 的数据
WHERE ( code = '99' OR code = '00' )
 AND NOT ( country = 'USA' ).
 *也可以将查询条件放入内表中,动态指定,
 *必须指定在括号内,没有空格
 WHERE <condition>  AND (itab).

3.5多表联查
多表联查的方式有左连接,内连接,右连接,子查询等,理论上来说子查询的效率是最低的.
1.SELECT语句嵌套
SAP ABAP openSQL数据库操作(二)

你可能感兴趣的:(SAP,ABAP(总结),SAP,ABAP,编程教程,OPEN,SQL,数据库,SAP,abap,openSQL,SQL)