SAP Native SQL 的简单说明

Open SQL访问数据字典中声明的数据库表,不区分数据库类型,执行时会自动转换为对应的语句,且可以使用本地缓存。Native SQL使用特定于数据库的SQL语句,但是可以访问比Open SQL 更多的表,更多的操作,缺点也很明显,比如没有语法检查,导致一些问题在运行时才能发现

简单列出三种使用Native SQL的场景

1 连接外部数据库访问数据

2 访问仅在数据库中的表,比如常见的慢SQL查询,以及处理SE14报错的表

3 一些特定数据库的语法的使用

Native SQL 分为Static Native SQL和Dynamic Native SQL

如下是Static Native SQL的一个简单查询例子

复制代码
DATA:ls_t001  TYPE t001,
     lv_bukrs TYPE bukrs VALUE '0001'.
DATA: lx_sql TYPE REF TO cx_sy_native_sql_error.

TRY.
      "结尾不加符号 . , 变量前加符号 : 
    EXEC SQL.
      SELECT *
       INTO :ls_t001
       FROM t001
       WHERE mandt = '000' AND bukrs = :lv_bukrs
    ENDEXEC.

  CATCH cx_sy_native_sql_error INTO lx_sql.

ENDTRY.

如下是Dynamic Native SQL的一个简单查询例子

复制代码
DATA: lt_t1 TYPE TABLE OF t001,
        ls_t1 TYPE t001.

  DATA: lo_sql    TYPE REF TO cl_sql_statement,
        lx_sql    TYPE REF TO cx_sql_exception,
        lx_sqlpa  TYPE REF TO cx_parameter_invalid,
        lo_result TYPE REF TO cl_sql_result_set,
        lr_t1     TYPE REF TO data.

  TRY.
      CREATE OBJECT lo_sql EXPORTING con_ref = cl_sql_connection=>get_connection( cl_sadl_dbcon=>get_default_dbcon( ) ).
      lo_result = lo_sql->execute_query( |SELECT * FROM t001 WHERE mandt = { sy-mandt } AND bukrs = '0001' | ).
      GET REFERENCE OF lt_t1 INTO lr_t1.
      lo_result->set_param_table( lr_t1 ).
      lo_result->next_package( ).
      lo_result->close( ).
    CATCH cx_sql_exception INTO lx_sql.
      DATA(lv_t) = lx_sql->get_text( ).
    CATCH cx_parameter_invalid INTO lx_sqlpa.
      lv_t = lx_sqlpa->get_text( ).
  ENDTRY.

关于Open SQL 和Native SQL的效率,通过一个简单的demo程序进行验证(ORACLE数据库,750)

测试表为随机生成的100W条数据,根据单主键获取多条数据,通过选择条件和执行顺序排除缓存的影响,大概结果为Open SQL 和Static Native SQL的效率相差不多,均优于Dynamic Native SQL,其中一次的输入截图如下

Native SQL 在应用在外部数据库取值时,需要添加数据库连接

事务代码:DBACOCKPIT

直接通过Native SQL 访问外部数据库不太建议,类似的需求可以考虑使用hana虚拟表处理。

相关推荐
不辉放弃5 小时前
SQL 主键(Primary Key)
数据库·sql·oracle
画扇落汗7 小时前
Python 几种将数据插入到数据库的方法(单行插入、批量插入,SQL Server、MySQL,insert into)
数据库·python·sql·mysql
Full Stack Developme7 小时前
SQL 查询中使用 IN 导致性能问题的解决方法
数据库·sql
XiaoLeisj8 小时前
【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统:查询图书属性接口(注解实现)、修改图书属性接口(XML 实现)
xml·java·数据库·spring boot·sql·java-ee·mybatis
Gauss松鼠会10 小时前
GaussDB回调机制深度实践:从事件驱动到系统集成
开发语言·javascript·数据库·sql·gaussdb
狂奔solar17 小时前
Vanna + qwq32b 实现 text2SQL
数据库·sql
OceanBase数据库官方博客21 小时前
火山模型的优缺点与优化实践 | OceanBase SQL优化
sql·oceanbase·分布式数据库
Dav_20991 天前
dav_1_MySQL数据库排查cpu消耗高的sql
数据库·sql·mysql
小诸葛的博客1 天前
Go 语言中的select是做什么的
数据库·sql·golang