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虚拟表处理。

相关推荐
盗理者8 分钟前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill
爱喝水的鱼丶2 小时前
SAP-ABAP:性能优化效果验证与回归测试:优化前后性能对比、业务逻辑兼容性校验方案
性能优化·sap·abap·回归测试·开发交流·交流学习
上海云盾商务经理杨杨2 小时前
SQL 盲注入渗透实战!无报错页面也能成功注入
数据库·sql
han_hanker3 小时前
SQL语法 一个统计的查询
sql
竹枝溪5 小时前
MySQL数据库零基础入门
数据库·sql·mysql·navicat·ddl·dml·dql
爱喝水的鱼丶17 小时前
SAP-ABAP:接口与报表场景专项优化:RFC/ODATA 接口、ALV 报表的性能提升方案
运维·性能优化·接口·sap·abap·rfc·经验交流
smilejingwei19 小时前
CodeBuddy+SQLazy 编写复杂 SQL 详解
sql·codebuddy·sqlazy
蒲公英eric1 天前
从布尔盲注到参数化查询:DVWA SQL 盲注模块完整漏洞分析教程
sql·web安全·ai·dvwa·ai安全·sql 盲注
今天AI了吗1 天前
MCP 协议打通 AI 与国产数据库,SQL 调优全流程一站式闭环
数据库·人工智能·sql
灯澜忆梦1 天前
【MySQL11】进阶篇 | 索引_#3使用规则
数据库·sql·mysql·性能优化