ABAP 中使用 Native SQL 进行大小写模糊查询

Open SQL 允许我们访问在 ABAP 字典中声明的数据库表,而不管您使用的数据库平台如何。通常开发都是直接用这种 SQL 查询语句,可以查看我之前的文章。

而 Native SQL (原生 SQL )允许我们在 ABAP 程序中使用特定于数据库的 SQL 语句。这意味着您可以使用不受 ABAP 字典管理的数据库表,从而集成不属于 SAP Web AS ABAP 系统的数据。

通常,包含特定于数据库的 SQL 语句的 ABAP 程序不会在不同的数据库系统下运行。如果程序将在多个数据库平台上使用,请仅使用 Open SQL 语句。

ABAP 程序中的 Native SQL

想要在 ABAP 程序中使用原生 SQL 语句,必须在前面加上 EXEC SQL 语句,并在查询的最后加上 ENDEXEC 语句,语法如下:

ABAP 复制代码
EXEC SQL [PERFORMING form].  

<Native SQL>

ENDEXEC.

Native SQL 语句后没有句点 (.)。此外,在 Native SQL 语句中使用双引号 ( " ) 或在行首使用星号 (*) 不会像在普通 ABAP 语法中那样变成注释。同时,我们还需要知道表和字段名称在所查询的数据库中是否区分大小写

在 Native SQL 语句中,使用主机变量在数据库表和 ABAP 程序之间传输数据。这些变量在 ABAP 程序中声明,并在本机 SQL 语句前面加上冒号 (:)。可以使用基本结构作为主变量。在特殊情况下,INTO 子句中的结构被视为单独列出其所有字段。

如果本机 SQL SELECT 语句中的选择是表,则可以使用 PERFORMING 条件将其逐行传递给 ABAP。程序为读取的每一行调用一个子例程表单。您可以在子例程中进一步处理数据。

与在 Open SQL 中一样,sy-dbcnt 包含语句 ENDEXEC 之后的已处理行数。sy-subrc 在几乎所有情况下都在语句 ENDEXEC 之后值 0,游标操作除外:在 FETCH 之后,sy-subrc 可能会读取更多记录。当您使用 EXEC SQL PERFORMING 读取结果集时,这也适用。


大小写模糊查询

最近接到用户需求,想要通过供应商名称进行模糊查询,不论输入的是大写还是小写,能同时把大小写名称符合的匹配出来。

我心想这不是很容易吗,然后就用了下面的 SQL 语句,谁知道根本就没有这语法,激活就报错:

ABAP 不支持下面的语法:

SQL 复制代码
SELECT DISTINCT lifnr name1 name2 FROM lfa1  
 WHERE LOWER( name1 ) LIKE @search_term  
 INTO TABLE @lt_lfa1.

这条语句是会报错的,ABAP OPEN SQL 没有这种类似的 SQL 的语法,但可以使用如下代码:

ABAP 复制代码
REPORT zupper_lower.  
TABLES lfa1.  
DATA: BEGIN OF ls_lfa1,  
        lifnr TYPE lfa1-lifnr,  
        name1 TYPE lfa1-name1,  
        mcod1 TYPE lfa1-mcod1,  
      END OF ls_lfa1.  
DATA: lt_lfa1 LIKE TABLE OF ls_lfa1.  
  
" lower case  
DATA: search_term TYPE string.  
  
PARAMETERS: p_name(200) TYPE c LOWER CASE.  
  
search_term =  |%{ to_lower( p_name ) }%|.  
  
  
  
*SELECT DISTINCT lifnr name1 name2 FROM lfa1  
* WHERE lower( name1 ) LIKE @search_term  
* INTO TABLE @lt_lfa1.  
  
EXEC SQL PERFORMING loop_output.  
  SELECT lifnr, name1, mcod1  
    INTO :ls_lfa1  
    FROM lfa1  
 WHERE LOWER(name1) LIKE :search_term  
ENDEXEC.  
  
FORM loop_output.  
  APPEND ls_lfa1 TO lt_lfa1.  
ENDFORM.  
  
START-OF-SELECTION.  
  PERFORM show_data.  
  
*&---------------------------------------------------------------------*  
*&      Form  SHOW_DATA  
*&---------------------------------------------------------------------*  
*       text  
*----------------------------------------------------------------------*  
*  -->  p1        text  
*  <--  p2        text  
*----------------------------------------------------------------------*  
FORM show_data .  
  IF lt_lfa1 IS NOT INITIAL.  
  
*  APPEND lfa1 TO lt_lfa1.  
    cl_demo_output=>display( lt_lfa1 ).  
  
  ELSE.  
  
    WRITE : 'search failed!'.  
  
  ENDIF.  
ENDFORM.

运行程序,结果如下:

参考链接:Native SQL

相关推荐
宋小黑5 分钟前
JDK 6到25 全版本网盘合集 (Windows + Mac + Linux)
java·后端
念何架构之路14 分钟前
Go进阶之panic
开发语言·后端·golang
先跑起来再说17 分钟前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
码农阿豪1 小时前
Flask应用上下文问题解析与解决方案:从错误日志到完美修复
后端·python·flask
威迪斯特1 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
程序员良许2 小时前
三极管推挽输出电路分析
后端·嵌入式
Java水解2 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
Java水解2 小时前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记2 小时前
工商银行今年的年终奖。。
后端