Native SQL

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4293506.html

Native SQL允许你针对数据库来使用原生的SQL,这些SQL可能是标准的SQL,也可以是某数据库特定的SQL。如果使用database-specific SQL语句,则数据库不能更换,否则请使用Open SQL。

本地SQL会绕过R/3 database interface,操作时不会记录日志,不会同步应用服务器上的database buffer。另外,使用ABAP Dictionary定义的类型为LCHR or LRAW的长列时,这些列需要使用Open SQL来读取,因为读取这些字段时,还需要使用另外存储此类型长列的长度信息,才能准确读出。最后,本地SQL是不会自动能客户端字段MANDT字段进行处理,该字段会像普通字段那样对待。

为了事务的一致性,在本地SQL中不要使用事务控制的语句(如COMMIT, ROLLBACK WORK),以及事务设置语句(如级别设置)

普通SQL

EXEC SQL [PERFORMING <form>].
<Native SQL statement>[;]

ENDEXEC.

Native SQL statement后面的分号是可选的,但不能是“.”

如果Native SQL 是一个从表里SELECT statement时,你可以通过PERFORMING选项的<form>里来一行行读取,如果不需要处理返回结果,或者是UPDATE、DELETE语句时,可以省略选项。

在ENDEXEC执行完后,SY-DBCNT存储了处理的数据行数。在几乎所有情况下,在执行ENDEXEC 后,SY-SUBRC都会为0,但是游标除外,在After FETCH之后,如果没有读取到数据,SY-SUBRC将会为4。

DATA: BEGIN OF wa,
  connid TYPE spfli-connid,
  cityfrom TYPE spfli-cityfrom,
  cityto TYPE spfli-cityto,
END OF wa.
DATA c1 TYPE spfli-carrid VALUE ‘LH‘.

"Native SQL语句不能以句点号结尾;

"不能在EXEC SQL…ENDEXEC间有注释,即不能有星号与双引号的出现;

"另外还要注意数据库系统大小写是否敏感;

"参数占位符使用冒号,而不是问号;
EXEC SQL PERFORMING loop_output.
  SELECT connid, cityfrom, cityto
    INTO :wa
    FROM spfli
    WHERE carrid = :c1
ENDEXEC.
FORM loop_output.
  WRITE: / wa-connid, wa-cityfrom, wa-cityto.
ENDFORM

或者将上面的INTO :wa替换为:

INTO :wa-connid ,:wa-cityfrom ,:wa-cityto

也可以。

调用存储过程

EXECUTE PROCEDURE<name> ( <parameter list> )

参数以逗号分隔,并需要IN、OUT 来指定是输入还是输出参数,或者是使用INOUT来表示即是输入也是输出参数

EXEC SQL.
  EXECUTE PROCEDURE proc1 ( IN :x, OUT :y )
ENDEXEC.

游标处理:

•OPEN<cursor name>FOR<statement>

•FETCH NEXT <cursor name>INTO<target(s)>.

•CLOSE<cursor name>

DATA: arg1 TYPE string VALUE ‘800‘.
TABLES: t001.
"打开游标
EXEC SQL.
  OPEN c1 FOR SELECT MANDT, BUKRS FROM T001
              WHERE MANDT = :arg1 AND BUKRS >= ‘ZA01‘
ENDEXEC.
DO.
  "读取游标
  EXEC SQL.
    FETCH NEXT c1 INTO :t001-mandt, :t001-bukrs
  ENDEXEC.
  IF sy-subrc <> 0.
    EXIT.
  ELSE.
    WRITE: / t001-mandt, t001-bukrs.
  ENDIF.
ENDDO.
"关闭游标
EXEC SQL.
  CLOSE c1
ENDEXEC.

时间: 2024-10-16 01:22:14

Native SQL的相关文章

13.hibernate的native sql查询(转自xiaoluo501395377)

hibernate的native sql查询 在我们的hibernate中,除了我们常用的HQL查询以外,还非常好的支持了原生的SQL查询,那么我们既然使用了hibernate,为什么不都采用hibernate推荐的HQL查询语句呢?这是因为HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中,如果在我们的一个大型项目中(数据量超过了百万级),这个时候如果使用hibernate的HQL查询的话,会一次将我们查询的对象查询出来后放到缓存中,这个时

使用Hibernate+MySql+native SQL的BUG,以及解决办法

本来是mssql+hibernate+native SQL 应用的很和谐 但是到了把mssql换成mysql,就出了错(同样的数据结构和数据). 查询方法是: [java] view plaincopy String sql = "select id XXX_ID  from t_tab"; List<Map> list = session.createSQLQuery(sql) .setResultTransformer(Transformers.ALIAS_TO_ENT

Open SQL和Native SQL到底有什么本质的区别

1.個人愚見:它們只是在实现的方式上,执行效率上不同,有的书上还说native sql存在一定风险 *& 20170521 171300 1.Open sql 是由创建数据库数据的ABAP命令构成的,在不同的DBMS(数据库管理系统)环境下其语法相同.OPEN SQL不能使用 DDL.DCL,只能使用类似于 select 语句的DML 语言.另外,还可以使用本地缓冲器,并且比NATIVE SQL的使用方法简单.ABAP 程序有激活时自动执行Syntax check特点. 2.Native SQL

Hibernate 使用原生 Native SQL

零.  前言 简单的查询一般都使用 HQL , 开发效率会比较高, 但是复杂的查询如果前期用 HQL , 那么后期出现慢查询, 就不得不用 原生 SQL 重写一遍, 要是滥用 HQL 返回各种对象, 用对象到处操作, 最后的慢查询调优简直就是条不归路. 笔者最近在做一个 10 年老项目的慢查询调优, 深有感悟, 本文只介绍 Hibernate 如何使用原生 SQL, 调优工作请看笔者其他文章. 一.  代码示例 使用原生 SQL 的工具类: public SQLQuery findQueryBy

Open SQL详解

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4293497.html 读取数据SELECT. 262 读取单行... 263 DISTINCT. 263 读取多行... 264 列别名... 264 存储到指定变量中... 264 SELECT * INTO….. 265 追加读取APP

[ABAP技术总结]OPEN SQL

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 4.      OPEN SQL. 43 4.1.           SELECT .INSERT.UPDATE.DELETE.MODIFY. 43 4.2.           条件操作符... 44 4.3.           RANG条件内表... 44 4.4.           FOR ALL ENTRIES. 45 4.5.           INNE

Yet Another 10 Common Mistakes Java Developers Make When Writing SQL (You Won’t BELIEVE the Last One)--reference

(Sorry for that click-bait heading. Couldn't resist ;-) ) We're on a mission. To teach you SQL. But mostly, we want to teach you how to appreciate SQL. You'll love it! Getting SQL right or wrong shouldn't be about that You're-Doing-It-Wrong? attitude

[TroubleShooting]&#39;trn\bak&#39; is incorrectly formed. SQL Server cannot process this media family.

 SQL Server online consultants came across an interesting scenario where one of our client was unable to restore a native SQL Server backup successfully performed from one instance running on Machine A on another instance of SQL Server running on m

hibernate sql查询

如果你跟我一样比较熟悉SQL,同时不想学习一门新的语言.那么在hibernate中使用Native SQL 查询也是一种不错的方式. 一方面,Native SQL在效率方面有天生的优势: 另一方面,SQL是数据库操作的一种标准,我们与程序.数据库关联很小.如果将来不用hibernate,而是用别的ORM,sql一样好用. 但尽量用标准SQL,而不要用过多方言SQL. 标量查询 最基本的 SQL 查询就是获得一个标量(数值)的列表. sess.createSQLQuery("SELECT * FR