版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录 TOC o 1-3 h z u HYPERLINK l _Toc316646425 1引言 PAGEREF _Toc316646425 h 1 HYPERLINK l _Toc316646426 1.1目的及范围 PAGEREF _Toc316646426 h 1 HYPERLINK l _Toc316646427 1.2参考资料 PAGEREF _Toc316646427 h 1 HYPERLINK l _Toc316646428 1.3定义 PAGEREF _Toc316646428 h 1 HYPERLINK l _Toc316646429 1.4文档结构 PAGEREF _Toc
2、316646429 h 1 HYPERLINK l _Toc316646430 2数据库基础 PAGEREF _Toc316646430 h 1 HYPERLINK l _Toc316646431 2.1SQL概念 PAGEREF _Toc316646431 h 1 HYPERLINK l _Toc316646432 2.2SQL的组成 PAGEREF _Toc316646432 h 2 HYPERLINK l _Toc316646433 2.3Open SQL PAGEREF _Toc316646433 h 2 HYPERLINK l _Toc316646434 2.4Native SQL
3、PAGEREF _Toc316646434 h 2 HYPERLINK l _Toc316646435 3提取数据 PAGEREF _Toc316646435 h 3 HYPERLINK l _Toc316646436 3.1SELECT语句 PAGEREF _Toc316646436 h 3 HYPERLINK l _Toc316646437 3.2选择单行数据 PAGEREF _Toc316646437 h 3 HYPERLINK l _Toc316646438 3.3选择多行数据 PAGEREF _Toc316646438 h 5 HYPERLINK l _Toc316646439 3.
4、3.1读取多行 PAGEREF _Toc316646439 h 5 HYPERLINK l _Toc316646440 3.3.2多行选择选择到内表 PAGEREF _Toc316646440 h 5 HYPERLINK l _Toc316646441 3.3.3指定包的大小 PAGEREF _Toc316646441 h 6 HYPERLINK l _Toc316646442 3.4指定查询条件 PAGEREF _Toc316646442 h 6 HYPERLINK l _Toc316646443 3.4.1比较运算符 PAGEREF _Toc316646443 h 6 HYPERLINK
5、l _Toc316646444 3.4.2范围限定运算符号( BETWEEN ) PAGEREF _Toc316646444 h 6 HYPERLINK l _Toc316646445 3.4.3字符比较运算符 PAGEREF _Toc316646445 h 7 HYPERLINK l _Toc316646446 3.4.4检查列表值 PAGEREF _Toc316646446 h 7 HYPERLINK l _Toc316646447 3.4.5检查空值 PAGEREF _Toc316646447 h 7 HYPERLINK l _Toc316646448 3.4.6检查选择表 PAGERE
6、F _Toc316646448 h 8 HYPERLINK l _Toc316646449 3.4.7动态SQL PAGEREF _Toc316646449 h 8 HYPERLINK l _Toc316646450 3.5多表结合查询 PAGEREF _Toc316646450 h 8 HYPERLINK l _Toc316646451 3.5.1SELECT语句嵌套 PAGEREF _Toc316646451 h 9 HYPERLINK l _Toc316646452 3.5.2for all entries PAGEREF _Toc316646452 h 9 HYPERLINK l _T
7、oc316646453 3.5.3结合查询 PAGEREF _Toc316646453 h 10 HYPERLINK l _Toc316646454 3.5.4子查询 PAGEREF _Toc316646454 h 11 HYPERLINK l _Toc316646455 3.6组合查询结果 PAGEREF _Toc316646455 h 12 HYPERLINK l _Toc316646456 3.6.1总计功能 PAGEREF _Toc316646456 h 12 HYPERLINK l _Toc316646457 3.6.2分组总计 PAGEREF _Toc316646457 h 13
8、HYPERLINK l _Toc316646458 3.6.3指定分组条件 PAGEREF _Toc316646458 h 14 HYPERLINK l _Toc316646459 3.6.4指定行的顺序 PAGEREF _Toc316646459 h 14 HYPERLINK l _Toc316646460 3.7其他格式说明 PAGEREF _Toc316646460 h 15 HYPERLINK l _Toc316646461 3.7.1使用表工作区域 PAGEREF _Toc316646461 h 15 HYPERLINK l _Toc316646462 3.7.2动态指定数据表 PA
9、GEREF _Toc316646462 h 16 HYPERLINK l _Toc316646463 3.7.3指定数据区域 PAGEREF _Toc316646463 h 16 HYPERLINK l _Toc316646464 3.7.4设置缓存机制 PAGEREF _Toc316646464 h 16 HYPERLINK l _Toc316646465 3.7.5限定选择的行数 PAGEREF _Toc316646465 h 17 HYPERLINK l _Toc316646466 3.7.6操作性能分析 PAGEREF _Toc316646466 h 17 HYPERLINK l _T
10、oc316646467 3.8使用光标 PAGEREF _Toc316646467 h 18 HYPERLINK l _Toc316646468 4更新数据 PAGEREF _Toc316646468 h 19 HYPERLINK l _Toc316646469 4.1INSERT语句 PAGEREF _Toc316646469 h 19 HYPERLINK l _Toc316646470 4.1.1插入单行数据 PAGEREF _Toc316646470 h 19 HYPERLINK l _Toc316646471 4.1.2插入多行数据 PAGEREF _Toc316646471 h 20
11、 HYPERLINK l _Toc316646472 4.2UPDATE语句 PAGEREF _Toc316646472 h 20 HYPERLINK l _Toc316646473 4.2.1更新单行数据 PAGEREF _Toc316646473 h 20 HYPERLINK l _Toc316646474 4.2.2更新多行数据 PAGEREF _Toc316646474 h 21 HYPERLINK l _Toc316646475 4.3MODIFY语句 PAGEREF _Toc316646475 h 22 HYPERLINK l _Toc316646476 4.3.1添加或更新单行
12、PAGEREF _Toc316646476 h 22 HYPERLINK l _Toc316646477 4.3.2添加或更新多行的语法要求 PAGEREF _Toc316646477 h 22 HYPERLINK l _Toc316646478 4.4DELETE语句 PAGEREF _Toc316646478 h 22 HYPERLINK l _Toc316646479 4.4.1删除单行数据 PAGEREF _Toc316646479 h 22 HYPERLINK l _Toc316646480 4.4.2删除多行数据 PAGEREF _Toc316646480 h 22 HYPERLI
13、NK l _Toc316646481 4.4.3删除所有数据 PAGEREF _Toc316646481 h 23 HYPERLINK l _Toc316646482 5具体案例 PAGEREF _Toc316646482 h 23 HYPERLINK l _Toc316646483 5.1程序 PAGEREF _Toc316646483 h 23引言数据库是企业基本的信息资源及所有需长期保存的数据的物理存储区域,在SAP系统中,数据库表的创建和维护一般通过数据字典进行,对表中数据的操作则通常通过ABAP程序中的Open SQL语句完成。目的及范围本文档主要介绍数据库的读取及更新操作,可适用于
14、ABAP开发人员,分析人员使用参考资料SAP程序设计定义在R/3系统中,需长期保存的数据都存储在关系数据库中。关系数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系模型是由埃德加科德于1970年首先提出的,并配合“科德十二定律”。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。文档结构文档的各章节介绍的内容如下:第2节数据库基础第3节提取数据第4节报更新数据第5节具体案例数据库基础SQL概念标准数据查询语言SQL(Structured Query Language)是一种
15、基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。SQL的组成SQL中可以实现三种类型的数据库操作:数据定义(Data Definition),定义数据库的逻辑结构,创建和管理数据库对象表、视图和索引等,但不涉及具体的数据。标准SQL中进行相关操作的语音集合称为DDL(Data Definition Language)。主要有CREATE、DROP、ALTER等语句。数据操纵(Data Manipulation),包括数据查询和数据更新两大类操作,数据查询即为对符合某些条件的数据之读取,数据更新包括数据的插入、删除和修改操作。标准SQL中进行相关操作的语言集合称为DML(Dat
16、a manipulation)。主要有SELECT、INSERT、UPDATE、DELETE等语句。数据控制(Data Control),用于实现用户权限、数据安全性控制和数据操作一致性检查。标准SQL中进行相关操作的语言集合称为DCL(Data Control Language)。主要有GRANT、REVOKE、COMMIT、ROLLBACK等语句。对于SQL语言中的数据定义DDL和数据控制DCL功能,在SAP系统中不能通过Open SQL语句来实现。Open SQL背景:SAP系统本身不提供数据库硬件系统,但其支持多种类型的数据库.程序员通过SAP提供的数据库接口操作这些底层的数据库。该接
17、口可以将ABAP语言转换成特定的数据库系统可以识别的SQL语言。定义:OPEN SQL是完全集成到ABAP语言中的标准SQL子集。优点:其优越之处在于其独立于不同类型的数据库之上,通过SAP的数据库接口来识别各种不同的数据库,然后由该接口把SAP的Open SQL语句自动转换为相应数据库的特定SQL语句,这样SAP程序员就无需去阅读不同数据库的标准SQL文档,而且ABAP程序也因此实现了数据库平台无关性。Native SQL背景:SAP系统支持两种在程序中操作数据库的语句形式。分别为ABAP语言中的OPEN SQL与特定数据库自身的SQL,NATIVE SQL语句。定义:Native SQL是
18、在ABAP程序中调用特定数据库本身的SQL语句。优缺点:Native SQL可以涵盖所有的SQL功能库类型,其次需要了解数据库所使用的SQL语句的具体语法形式,因而包含NATIVE SQL语句的的程序依赖目前使用的数据库系统。不具备良好的移植性。Native SQL与ABAP仅仅是松散的整合,而且在SAP系统中的应用很有限。提取数据ABAP程序通常使用Open SQL的数据查询语句SELECT将数据库条目选择到内存中。SELECT语句基本语法:SELECT FROM INTO WHERE fields说明需要读表的哪些字段table说明需要读哪个数据源(数据源可以是表或者视图)。target说
19、明读出的字段要放到哪些目标数据对象中condition说明读数据的基本条件可选。整体语法结构:select from into where group by having order by 选择单行数据语法:select single into from 使用 SELECT SINGLE 语句从数据库表读取单条记录,为了确保读出唯一记录,应当在 WHERE 块指定全部主键的值。Client 字段在这里可以不必指定,系统会自动选定属于当前client的记录在系统中找到第 一个符合条件的数据,就停止查询。在确定数据条目是唯一的时候,使用单行选择可以提高查询效率。 每次进行完数据库操作语句后,都要对
20、sy-subrc进行判断。如果系统找到了一个符合条件的行,SY-SUBRC 返回0,否则返回4 图3-1在 SELECT 语句中使用 CLIENT SPECIFIED 子句可以关闭自动客户端选定,从选择条件里指定访问某个客户端的数据可以使用掩码 * 来指定选中数据表的全部字段,不过为了减少数据量,建议指定选中字段作用:如果一个指定的扁平结构作为目标对象,且该结构体中的字段多于需要选择的字段;该选项不会把所有字段内容都放进目标区中,而只讲SELECT子句中指明字段内容传送到目标工作区的同名组件中,如果需要,在传输的过程中,可能进行类型的转换。缺点:使用这种结构可以节省代码,但是不如指定数据对象列
21、表高效,应为系统需要在各个字段之间的名称比较。该形式适用于动态(事先不知道需要那些字段)确定需要选择的数据表字段的情况。示例一:INTO到数据结构、选择全部字段示例二:INTO到数据字段,选择指定字段示例三:选择相关字段选择多行数据读取多行比单行根据普遍意义的是符合条件的数据不止一个,并且需要全部选取,此时需要在SELECT子句中去掉SINGLE附加项,选择多行,分两种情况,选择到内表、循环选择;也可以用*或指定列。以使用 SELECT ENDSELECT 循环来处理多条数据库记录。根据选择结果,申明一个工作区或者几个基本类型变量使用 SELECT 循环时,数据库把数据按一个一个的包发送到应用
22、服务器的数据库接口,然后进程块把需要的数据一条一条拷贝到工作区进行处理,直至循环结束,注意:下一个条数据会覆盖上一条数据。在 SELECT 循环后会产生一些返回值,sy-subrc 为 0 说明至少查询到一条记录,而 sy-dbcnt 则记录了一共查询到多少条记录示例一:读取多行,不建议使用多行选择选择到内表多行选择更为方便的形式是一次性把数据选择到一个内表中,这样就不需要进行循环(因为内表的行数是动态),语法如下 :SELECT . INTO |APPENDING CORRESPONDING FIELDS OFTABLE ITAB在该情况下,SELECT 并不启动循环,因而不需要使用ENDS
23、ELECT 。语句如果内表ITAB非空,则选择出的数据覆盖原来的数据,如果希望不覆盖原来的数据,则用APPENDING关键字代替INTO关键字。内表可以与数据库结构相同,也可以不同。也可以使用TINTO子句中的CORRESPONDING FIELDS选项将同名区域相对应。示例一:多行选择-选择到内表指定包的大小包的大小是指一次选择到内表的行数,如果需要将所选择行按预定义大小的包一段段的读到内存中,可以使用INTO子句的PACKAGE size选项SELECT * INTO TABLE itab package size n endselect. 因为指定了包的大小,该语句以循环方式出现,如果N
24、小于或者等于零。将出现运行时错误。假如指定了包的大小为3,而数据库中共有5条满足条件的数据行数,则这5条数据并不是一次性读入内表中,而是按照大小为3行的包分成两次读入内表当中。第一次写入内表3行数据,第二次SELECT循环内,这3行数据被清空,又有下一个包(只有2行数据)被写入内表。指定查询条件指定选择条件是提高选择效率的主要方式 ,可以有效的控制需要读取的数据行。在OPEN SQL的WHERE 子句的选择条件中,大量比较运算符和ABAP其他语句路基表达式的意义与使用方式一致。但因为其中的运算符同时需要符合SQL基本原则,也有部分差异,常用的有一下几大类。比较运算符 “=”、“” 、“” 、“
25、=”和相应的关键字如EQ等 范围限定运算符号( BETWEEN ) WHERE F NOT BETWEEN G1 AND G2字符比较运算符 对于字符类型的数据字段,可以使用LIKE 运算符进行模式化的比较,格式如下:WHERE F NOT LIKE G1 ESCAPE h.数据条目中,字符F中的值必须(或不能)符合G的模式,G中的通配符“_”用于代替单个字符,“%”用于代替任意字符,包括空子字符串SELECT WHERE CITY LIKE %TOWN%选定所有包含“TOWN”单词的城市名称如果在比较中,G字段本身要用到通配符,可以使用ESCAPE选项指定一个或略符号H,如果通配符号前边有符
26、号H, 那么通配符号和忽略符号本身失去了他在模式G 的功能,而是还原为其本意。 SELECT WHERE FUNC LIKE EDIT#_% ESCAPE #选定所有以“EDIT_”开始的功能名称。在LIKE 条件中使用通配符“_”和“%”是为了遵循SQL的标准,读者不要混淆ABAP一般逻辑表达式的字符串模式与比较WHERE 子句中类似操作格式检查列表值可以使用下述格式检查数据库字段的值是否(或不能)等于括号内列表中的一个值:WHERE F NOT IN (G1,G2)该形式中,括号和比较字段G之间不能有空格,但在比较字段之间可以有空格。SELECT WHERE CITY IN (Berlin
27、,Rome,London).示例:输出结果:检查空值IS NULL用于判断数据库字段中的值是否为空值,表示格式:WHERE F IS NOT NULL 。在数据库中,有一种字段值为空值(null),表示该数据字段没有任何数据内容,然而在ABAP中,特定的数据对象都具有初始值,这些初始值可能是一串0或空格(SPACE)等,但不等同于数据库的NULL值,因而,在ABAP语句中添加数据条目时,所有的数据库字段都不可能是空值。但是,在ABAP数据字典里仍然有可能有空值,因为NATIVE SQL可以进行空值字段设定。用数据字典工具添加数据时也可能出现空值,但是在数据选择过程中,如果将空值字段选入程序数据
28、对象中,也会转化为ABAP中相应字段的初始值。检查选择表选择表是一种复杂而强大的逻辑表达式组合形式,其本 身是一个内表,检查选择表意味着数据库字段F需满足所有逻辑表达式的组合。Where f not in seltab 其中seltab 是选择标准表,是具有特定格式的内表,可以通过SELECTOPTIONS 语句添加程序和报表选择屏幕,并由报表用户填充他,也可以在程序中创建(如果用RANGE语句)。上述这些基本的where 条件可以使用逻辑链接操作符 and、or和not按照任意顺序来进行组合使用。 select where (code = 01 or code =02 ) and not (
29、country = USA)选择那些CODE字段值为“01”、“02”并且COUNTRY 字段值不等于“USA”的行。动态SQL查询条件也可以全部或则部分运行时动态指定,方法为在程序中将所有选择条件放置到一个内表中:SELECT .WHER E and (ITAB) 内表ITAB仅包含一个类型C组件且最大长度为72的字段,内表名称必须在括号中指定,在括号有名称之间没有空格。可以使用本节中介绍的各种逻辑表达(IN 与选择表除外)添加到内表行中,内表行的逻辑表达式只能使用文字不能使用变量,该内表也可以为空。 示例:动态指定查询条件等价于SELECT * INTO TABLE ITAB_SPFLI
30、FROM SPFLI WHERE CITYFROM = BEIJING or CITYFROM = SINGAPORE .动态WHERE 条件只能用于查询语句而且要比在程序中指定花费更多的CPU时间。多表结合查询有时,应用程序需要从相关联的多个数据库表读数据进行评估,此时需要用某些结合条件(字段)把各个数据库连接起来。以表SPFLI和SCARR为例。二者之间通过外部关键字相连接,其中SCARR中包含SPFLI中CARRID(航空公司代码)字段的具体名称(即文字说明),该字段可以作为为结合选择的选择条件。结合选择可以有多种实现方式。SELECT语句嵌套可以通过SELECT语句的嵌套来实现这种相关
31、联的多个表的数据结合选择。示例:for all entries 可以避免多次重复的数据库查询。一旦在逻辑表达式的右操作数中指定了ITAB中的某个字段,就等于指定了选出所有内表行中该字段的值。换句话说,该SELECT语句的结果是用每一行ITABL中相应字段替换WHERE 句中指定并进行多次选择的结果集联合,然后从中删除重复行数。使用该格式时,数据库字段与内表中关联比较字段必须具有相同的类型与长度,且不能在比较中使用操作符like、between 和in ,同时不能使用order by子句。格式:select . From tabname for all entries in itab where
32、 示例:注意:使用前必须判断SPFLI_TAB是否为空,如果为空,则会把所有内容放到WA_SCARR中,数据量很大时很危险。输出结果:结合查询类似的,还可以使用结合查询(JOIN)在同一个 SELECT语句中读取多个表的数据,结合查询包括INNER JOIN和LEFT OUTER JOININNER JOIN的基本思想是,如果主数据表与结合表中存在共同的字段内容(结合条件字段),根据其共同值提取。SELECT FROM TABLE2 INNER JOIN JOINTABLE2 AS ALIASA ON . 其中,FROM子句的table是主选择表,后面可以根据需要用JOIN关键字选项加入几个数
33、据库表,称为结合表。ON选项用于制定结合条件,条件中的语法与WHERE 子句类似。但不同的逻辑只能用AND 连接,而且每一个条件中必须包含一个主选择表的字段。因为不同表中可能出现同名字段。可以通过“”指明其属性的数据库为其前缀。此外,为了选择过程的清晰起见,还引入了ALIAS作为数据库表的别名,对于一个数据表在多个结合表达式中出现的情况,必须使用别名作为前缀。可以把中的条件放置于WHERE子句中,因为二者的效果是相同的。但至少必须在ON中指明一个条件。该语句中INNER关键字可以省略。示例: Inner join基本规则是主选择表和结合表都必须满足ON中所指定的条件。即如果当前SPFLI中CA
34、RRID字段值为“SG”,则要选出一行数据,必须要在表SCARR中也含有相同的值“SG”字段。 LEFT OUTER JOIN与INNER JOIN的主要区别LEFT OUTER JOIN中,对于主选择表的数据,即使在结合表中结合条件字段值不存在,也将该数据行选出,结合表中不存在的字段保持空白。 select from table1 left outer join table2 as alias on Left Outer Join的语法要求更为严格,在ON附加项中,只能用“=”操作符号,且必须至少有一个条件是对主选择表和结合表中的字段进行比较。此外,不能在WHERE子句中对结合数据表中字段进
35、行条件限制,该语句中的OUTER 关键字可以省略。子查询上述情况中 ,一般需要多个表中所包含的不同字段。有时从一个表中选择数据时需要与其他表中的数据字段内容相关联,但不需要选出其他表中的具体数据,类似的操作可通过子查询进行。子查询是没有INTO子句的查询语句。通过EXISTS,IN或者逻辑运算符连接到WHERE 子句中,但不能和结合选择附加项ON同时出现。子查询可以进行嵌套 。示例:输出结果:如果子查询中选择只需要返回单个字段,则可以使用IN关键字:WHERE CITY IN (SELECT CITYFROM FROM SPFLI WHERE CARRID = SCARR-CARRRID)如果
36、使用逻辑运算符进行子查询,则需要区分结果为单行和多行两种情况,单行返回结果用“=”Where city = (SELECT CITYFROM FROM SPFLI WHERE CARRID = SCARR-CARRID)其他则可能有多行返回值,必须在子查询之前注明 ALL,ANY或SOME附件项,例如: Where city all (SELECT CITYFROM FROM SPFLI WHERE CARRID = SCARR-CARRID)ALL意味着满足所有子查询结果,ANY和SOME意味着至少对于一条子查询结果符合。组合查询结果许多情况下,从一个或多个数据表中选择多行数据的目的仅仅是为
37、了得到某些精简后的信息,例如需要所有符合条件数据中某列值的总和,如果将这些数据选进ABAP程序中然后在进行计算,则不是高效的处理方式。OPEN SQL 的SELECT 语句中在选择的同时提供总计功能,与此同时,还可以通过GROUP BY子句和HAVING 子句进行将选择结果进行分组 . 总计功能 如果在SELECT 子句中为特定字段指定MAX(最大值)、MIN(最小值)、SUM(求和)、AVG(平均值)和COUNT(行数)等功能,就可以在选择的同时进行相应的统计,可根据数据库表的某些字段选取具有某些特征的数据到某些变量中。 SELECT AGG(DISTINCT S1) AS A1 其中AGG
38、为使用总计功能表达式,S1为字段,A1为目标变量,用于存放总计结果。算术操作符AVG和SUM只能对数据字字段进行操作,DISTINCT选项将在统计之前先排除相同的结果。示例:输出结果:分组总计 中用GROUP BY 子句可以进行分组总计,其意义是将数据库表中一组某些指定字段相同的行的内容组合到单行中,其他字段则可以通过总计功能进行求和。分组总计只能应用在查询字段已经指定了的情况,因此只有指定单独的基本字段列表或者使用INTO CORRESPONDING FIELDS 附加项的SELECT语句才能进行分组选择。数据选择时,S1、S2等字段值全部相同的数据行被组合成一行,而Sm、Sn等字段需要进行
39、统计的字段。如果将总计功能与GROUP BY 子句一起使用,那么在统计表达式以外的所有数据库字段必须在GROUP BY 子句中出现。如果使用INTO CORRESPONDING FIELDS项,则需要通过AS后面的别名将总计结果存放在与别名同名的字段中。示例:输出结果:指定分组条件 可以使用HAVING子句给分组选择的结果限定条件,只有出现GROUP BY 子句时,才可以使用该子句。条件表达式的用法与WHERE 子句中的规则一致。但只有FROM子句和GROUP BY 子句中出现的字段才能在子句中使用。然而,无论字段是否在FROM子句中出现。只要未出现GROUP BY 子句中,均可以在HAVIN
40、G 子句中对使用总计表达式功能,而WHERE 子句不具备类似的功能。示例:输出结果:指定行的顺序在选择多行事,可以使用SELECT语句的ORDER BY子句指定行的顺序,按顺序将这些行传送给ABAP程序。排序的标准是数据表的主关键字或指定的字段。SELECT * FROM . ORDER BY PRIMARY KEY.系统将按主关键字的升序次序给所选出的结果行排序。SELECT * . ORDER BY f1 ASCENDING|DESCENDING f2 ASCENDING|DESCENDING .则按指定的表字段给所选行排序,可以在每个字段名后指定选项ASCENDING或DESCENDIN
41、G为每个表字段指定排序顺序,默认顺序为升序。示例:输出结果:其他格式说明 本节对Open SQL中的一些附加项和语句进行补充说明,某些功能并不是仅应用于SELECT语句,也适应于数据更新语句。使用表工作区域 表工作区是接口工作区中的一种,使用TABLES语句申明。 TABLESdbtab.表工作区相当于参照表结构申明的普通结构体数据对象,在ABAP/4.0之前的版本中,必须使用TABLES语句为所有要进行SQL操作的数据库表指定一个工作区,然而在新版本中,已经没有此限制,而且在ABAP Objects中不能该语句格式。在指定了表工作区域之后,SELECT语句中可以省略INTO子句,系统默认将数
42、据行读入到同名的表工作区中。示例:动态指定数据表上述实例中使用进行数据选择时,数据库表都是已经确定的,也可以在运行时通过变量指定数据库表的名称。SELECT . FROM (dbtabname) 变量字段dbtabname必须包含一个数据库表的名称,且必须为大小写形式。动态指定时,不能使用表工作区忽略INTO子句。dbname=spfli.SELECTcarridconnid FROM(dbname) INTO(l_int_carrid,l_int_connid)WHEREcityfrom=TOKYO.WRITE:/,l_int_carrid,l_int_connid.指定数据区域 前文提到,
43、R/3系统将应用分成若干个商业区域,这些分隔开来的区域分为集团,每个集团都分配一个数字ID,当用户登陆时,必须指明要登陆的集团ID,前文已经提及,属于特定集团的表都是系统自动生成一个默认字段MANDT,用于指定数据属于当前集团,该字段也是表的关键字段之一。但是有一些系统通用表是与集团无关的,可以跨区域存储。因而没有MANDT字段。一般情况下,QPEN SQL.程序远不能使用在WHERE子句中指定MANDT,否则会出现运行时错误。如果需要,按如下处理:SELECT|UPDATE.dbtabclientspecified 示例:设置缓存机制 每一次数据库访问都将增加数据库系统负载,如果一个数据表经
44、常被读取但很少被修改,则应当使用缓冲机制来减少负载。即在首次访问数据库时将数据读取到应用服务器内存中,供该服务器中所有其他应用共同使用。SELECT语句中的FROM子句的BYPASSING BUFFER附加项,可以用于在特殊情况下取消在数据字典中对该表设定的缓冲。此外,DISTINCT附加项与结合选择、总计选择、IS NULL条件、子查询,以及GROUP BY和ORDER BY同时使用时,也将自动忽略缓冲设定。SELECT.FROMdbtabBYPASSINGBUFFER.限定选择的行数 SELECT.FROMdbtabUPTOnROWS.如果N为正数,系统最多选择N行到程序中,如果N值为0,
45、则选择所有满足标准的数据,如果同时为ORDER BY 选项 ,则系统首先选出满足条件的数据,并排序,然后将头N行作为选择结果 操作性能分析通过GET RUN TIME语句,可以得到当前系统程序已经运行的时间。利用该语可以分析SQL语句(尤其是数据查询语句)的操作性能。如果需要对程序进行更为复杂的、全面的运行时性能分析,可以使用系统工具RUNTINE ANALYSIS (SE30) GETRUNTIMEFIELDf.示例:输出结果:如果需要对程序进行更为复杂的、全面的运行时性能分析,可以使用系统工具RUNTINE ANALYSIS (SE30)。使用光标 在SELECT 语句中,数据从数据库中以
46、大小为32KB的数据包传递到应用服务器中,并通过INTO子句传至ABAP程序。 OPEN SQ中提供了一套语句对数据的具体传输过程进行监测,这个监测通过操作数据库的光标进行。通过光标操作,在某些情况下,可以提高查询的效率。 使用光标几乎可从任何SELECT语句的结果集中获取得下一行(或一些行)。首先使用OPEN CURRSOR 语句将光标与相关的 SELECT 语句连接起来。OPENCURSORwithholdcFORSELECT.WHERE首先必须将光标C定义为类型CURSOR,不能在SELECT SINGLE 语句中使用光标。在打开光标后,就可以使用FECTCH 语句从OPEN CURRO
47、R语句生成的结果中读取下一行。 FETCH NEXT CURSOR C INTO 所选行都将读入INTO子句指定的目标区域。如果FETCH语句没有读任何行,SY-SUBRC返回为4,否则返回为0.必须使用CLOSE CURSOR语句关闭不再需要的光标。CLOSE CURSOR C. 在数据库提交时候,系统自动关闭光标,一个例外情况是如果在OPEN 语句中,使用了WITH HOLD选项,则NATIVE SQL数据库提交将不会关闭光标。示例:输出结果:程序分析:在程序中,定义了一个cursor类型的变量,并通过OPEN CURROR语句打开光标。一个打开的光标相当于指向某个地址的指针。多个光标可以
48、指向同一个选择。通过在FETCH语句中结合INTO子句,可以将当前光标选择传输至程序内表。更新数据OPEN SQL中使用INSERT UPDATE MODIFY DELETE语句进行数据的更行操作,这些语句本身的语法格式比SELECT 语句简单,但在数据更新的过程中,需要注意的是保持数据的一致性。更新语句可以对单行进行操作,也可以整体更新一些数据条目的集合,根据SQL语句操作效率原则,应尽可能整体更新多行数据。操作结束后的数据库更新语句将通过SY-SUBRR返回标识代码,如果操成功,则该代码设置为0。此外系统字段SY-DBCNT还将返回实际操作的数据行数。还需指明的是。所有的OPEN SQL语
49、句本身均不进行操作权限检查(如某写系统用户不能访问或更新某些特定数据库表),如果需要进行这方面的设定。需要在系统中创建授权对象。INSERT语句 Open SQL中的INSERT语句用于向数据库中插入新条目。插入单行数据使用INSERT语句可以通过工作区向数据库中插入单行数据,有两种语句格式。INSERT INTO DBTAB VALUS WAINSERT INTO DBTAB FROM WA其中,工作区WA是与数据表具有相同结构的数据对象,(至少各个对应组件的长度和对齐方式一致),一般直接基于数据表结构申明。在插入行之前,需要先把已更新的数据填充到该工作区中。示例:该语句也可以将数据行插入到
50、视图中,但有下述限制:首先该视图所有字段必须来自同一个数据表,而且在数据字典中的属性必须设置为可读取以及修改,其他数据更新语句也遵循该原则。INSERT 语句操作后,如果相同表关键字的数据条目已经存在,不能重复插入,只能对该行的非关键字段进行更改(可以用UPDATE 或MODIFY语句)。插入多行数据可以通过内表向数据库插入多行数据,语句格式如下INSERTdbtabFROMTABLEitab.其中内表itab 中包含希望插入的数据条目,该内表的行结构也必须和数据库表的行结构一致。如果所有的数据条目均成功插入,则SY-SUBRC 返回0.如果至少一行数据没有被插入,则触发运行时错误,而且系统不
51、更新任何数据。使用下列格式可以避免该错误的出现。INSERTdbtabFROMTABLEitabACCEPTINGDUPLICATEKEYS.其中ACCEPTING DUPLICATE KEYS选项的效果是:如果出现关键字相同条目,系统将SY-SUBRC 返回4,并跳过该条目,并更新所有其他条目。UPDATE语句更新数据条目意义为基于表关键字而言。工作区所代表的条目已经存在于数据库中,需要更改非关键字的值,在OPEN SQL中通过UPDATE 语句实现。 更改删除数据时,先从数据库中查询,判断是否是要修改/删除的数据,保存备份,再进行修改、删除。更新单行数据通过UPDATE 语句更新单行数据的
52、语法格式如下:UPDATEdatabSETf=gf=gWHERE使用SET 子句的字段值设定,可以将满足WHERE 子句条件的数据条目值进行更新。FI为组件字段名,GI为新设定的数值,在WHERE 子句中,为了确保只更新单行,必须指明全部表关键字段的值,而SET子句需要更新的字段则只能为非关键字。在SET语句中,对于数值字段,除F=G外,还可以使用F=F+G F=F-G两种形式在该字段原有数值上增减。通过工作区更改单行数据的语法形式如下:UPDATEdbtabFROMwa.在语句执行前,新的数据条目(包括所有关键字段和非关键字段的值)需要写入数据哭表结构相同的工作区。系统将要根据工作区中的表的
53、关键字段的值定位该数据行,并根据所有关键字段的值将改行进行更新。示例:更新多行数据也可以使用SET 和WHERE 子句同时更新多行数据:UPDATEdbtabSETf1=g1fi=giWHERE.此处不需要在where中限定所有表关键字段。该语句本身将要更新所有满足条件的数据条目,而不是根据关键字更新一个数据条目。如果不使用WHERE 子句。则将要更新当前数据集团中的所有行。如果至少有一行数据被更新。Sy-subrc 返回0.否则返回4.还可以通过内表来更新多行数据。 UPDATEtargetFROMTABLEitab.该语句相当于工作区的集合来更新数据库表,对于每一个内表行,都根据关键字段定
54、位数据表条目。并更改其他字段的数值。如果所有内表行更新表数据成功,SY-SUBRC 返回0。如果有某一行内表数据没有成功更新(与该行关键字段值相同的条目不存在,)则返回4. 示例:MODIFY语句MODIFY 语句是SAP的OPEN SQL中专有语句。该语句相当与UPDATE与INSERT语句的结合。当使用MODIFY语句操作数据库时,如果程序中指定的数据行已经存在与数据库中,则对其进行更新操作,如果尚未存在,则进行插入操作。引入MODIFY语句的原因在于,有时在进行数据库的更新操作时,并不确定数据库中是否已经含相应的数据行。但INSERT 和UPDATE 语句要求在操作之前首先要明确具有相同
55、关键字段数值的数据是否已经在数据库已经存在。如果不存在就进行UPDATE操作,如果存在就进行INSERT操作。都会导致无意义的结果。通过MODIFY语句,可以让系统辅助程序员进行判断适当的操作。但处于性能的原因。一般情况下只有确实需要,才使用此MODIFY 添加或更新单行添加或更改单行的语法要求:MODIFYDBTABFROMWA.该语句将工作区的内容写入数据库表中。如果在工作区中指定的关键字航在数据库不存在,则将添加到数据库表中,同用INSERT语句插入单行中所述。如果工作区指定得主关键字行在数据库表中已经存在,则更改数据库表中相应的行。用用UPDATE语句更改单行中所述。操作后SY-SUB
56、R恒为0,SY-DBCNT返回1添加或更新多行的语法要求 MODIFYDBTABFROMTABLEITAB.内表中的数据行将要覆盖数据库表中具有相同关键字的数据条目。若找不到已经存在的相同主关键字的数据条目,则将更新行添加到数据库表。对于添加行,该语句等同于使用内表中添加多行操作。对于更改行,该语句等同于使用内表添加多行操作。SY-SUBRC 总返回0。SY-DBCNT返回内表中的行数。DELETE语句数据条目的删除通过OPEN SQL中的DELETE语句进行。删除单行数据删除单行数据的语句格式如下: DELETE FROMdbtabWHERE.在WHERE 子句中,必须指明全部表关键字段的值
57、,或者使用DELETEdbtab FROM wa 该语句从数据库表DBTAB中删除主关键字与工作区WA中指定的主关键字相同的行。工作区的长度至少要等于数据库表的主关键字的长度。如果没有那一行的主关键字与工作区中相应字段匹配,则操作失败。删除多行数据删除单行数据可以通过WHERE子句进行DELETEFROMdbtabWHERE .该语句将从数据库表中删除所有符合条件的条目,需要注意的是检查内表不要使之为空,应为该操作是无意义的,不会删除任何数据条目。在该操作后,SY-DBCNT中将返回删除的行的数目。如果至少删除一行,sy-subrc 返回0.如果没有删除任何行,sy-subrc 返回4。通过内
58、表从数据库表中删除多行的语法如下:DELETEDBTABCLINETSPECIFIEDFROMTABLETAB. 该语句从数据库表中删除主关键字段数值与内表中某行相同的数据数目。其中内表行的长度至少与数据库表的主关键字长度相同。如果数据库表中没有任何一行的主关键字与制定内表行中数据值相同。则系统不删除该行,但系统不会中止整个操作,而是继续处理内表中的下一行。如果成功删除了内表中所有的行,SY-SUBRC将返回0,否则返回4。Sy-dbcnt中返回实际已经删除的行数。如果内表为空,则SY-SUBRC 和SY-DBCNT都将要返回0。示例:删除所有数据如果希望删除所有行可以通过下述两种形式之一实现
59、:在通过内表删除多行数据条目的过程中将内表设置为空,但是SY-SUBRC 总是为0。使用WHERE FIELD LIKE %作为where 子句中的唯一条件。具体案例程序*INTO到数据结构、选择全部字段DATA:l_wa_spfliTYPEspfli.SELECTSINGLE*FROMspfliINTOl_wa_spfliWHEREcityfrom=TOKYOANDcityto=ROME.WRITE:/,示例一:,l_wa_spfli-carrid.*INTO到数据字段,选择指定字段DATA:l_str_carridTYPEspfli-carrid,l_num_connidTYPEspfli
60、-connid.SELECTSINGLEcarridconnidFROMspfliINTO(l_str_carrid,l_num_connid)WHEREcityfrom=TOKYOANDcityto=ROME.WRITE:/,示例二:,l_str_carrid,l_num_connid.*选择相关字段DATA:l_wa_spfli2TYPEspfli.SELECTSINGLEcarridconnidFROMspfliINTOCORRESPONDINGFIELDSOFl_wa_spfli2WHEREcityfrom=TOKYOANDcityto=ROME.WRITE:/,示例三:,l_wa_s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年标准员考试模拟题题库(含答案)
- 乡村振兴背景下农村电商品牌建设研究论文
- 2026年中国海鲜干货市场深度研究与发展前景报告
- 2026年外科腹外伤模拟试题及答案详解
- 生态文明视角下乡村旅游可持续发展研究论文
- 2026年学年江西省吉安市公务员省考行政职业能力测验模拟题(含答案)
- 2026年裂解(裂化)工艺作业安全生产模拟考试题库(含答案)
- 2026年湖北二级wpsoffice题库(含答案)
- 文旅融合背景下露营文创产品研究论文
- 2026年劳务员专业知识考试题库(含答案)
- 妇科急腹症超声诊断
- 重卡充电站工程质量验收规范
- 国家能源集团校园招聘笔试真题及答案解析
- 重型颅脑损伤救治指南(2024版)
- 2026年(全国2卷)高考英语真题分析及2027备考建议
- 智能毛巾加热器赋能商业地产:提升客房溢价与运营效率实证
- DB31T+1695-2026租赁居住类农村自建房消防安全管理规范
- 2026-2030中国DSP芯片(数字信号处理器)行业深度评估及未来研发创新建议报告
- 工银e信交易合同
- 2025版建筑工程建筑面积计算规范
- GB/T 25085.6-2026道路车辆汽车电缆第6部分:交流600 V或直流900 V和交流1 000 V或直流1 500 V单芯铝导体电缆的尺寸和要求
评论
0/150
提交评论