ADBC 查询语法介绍:EXECUTE_QUERY

可使用 CL_SQL_STATEMENT 类的以下实例方法执行查询:

  • EXECUTE_QUERY

该方法有一个字符串类型的强制输入参数 STATEMENT,必须向其传递语法正确的 SELECT 语句。与 DML 语句一样,SET_PARAM 方法可用于将 ABAP 数据对象绑定到占位符。

查询结果将在返回值 RESULT_SET 中返回对 CL_SQL_RESULT_SET 类对象的引用。该对象的方法允许访问查询的结果集。为了在数据库 LUW 结束后保留结果集,可以在 EXECUTE_QUERY 方法的输入参数 HOLD_CURSOR 中填入 X。

结果对象的 CL_SQL_RESULT_SET 类提供了以下用于将结果集读入 ABAP 数据对象的实例方法,

SET_PARAM, NEXT, 和 CLOSE

这三个方法可访问结果集中的单个行和列

  • SET_PARAM:使用 SET_PARAM,必须通过向该方法传递每列的相应数据引用,从左到右为列分配兼容的 ABAP 数据对象。
  • NEXTNEXT 用于逐个寻址结果集中的行。如果可以寻址该行,则返回值为 1,否则为 0。
  • CLOSE
    使用 CLOSE 关闭读取。如果要修改两次调用 NEXT 之间的参数绑定,必须先调用 CLEAR_PARAMETERS 方法。

SET_PARAM_STRUCT、NEXT 和 CLOSE

这些方法提供了对结果集中各行的访问。

使用 SET_PARAM_STRUCT 方法,必须通过向方法传递相应的数据引用,为结果集的行分配完全兼容的 ABAP 结构。可以将指定要读取的列的名称和顺序的内部表传递给参数 CORRESPONDING_FIELDS。其余方法与 SET_PARAM 方法相同。

SET_PARAM_TABLE、NEXT_PACKAGE 和 CLOSE

这些方法可以访问结果集中的多行

使用 SET_PARAM_TABLE,必须通过向该方法传递相应的数据引用,为结果集的行分配一个结构完全兼容的内部表。与 SET_PARAM_STRUCT 一样,CORRESPONDING_FIELDS 参数用于指定要传送的列。

这里使用 NEXT_PACKAGE 代替 NEXT,最多读取传递给输入参数 UPTO 的行数。如果没有向 UPTO 传递任何值,则会读取所有行。在每次调用 NEXT_PACKAGE 时,读取的记录都会追加到内部表中,不会删除之前的内容,读取的记录数会在返回值 ROWS_RET 中返回。在更改参数绑定和 CLOSE 时,情况与 SET_PARAM 相同。

如果查询返回一个以上的结果集,上述方法默认访问第一个结果集,NEXT_RESULT_SET 方法可用于切换到下一个结果集。对于每个结果集,必须再次使用上述 SET_... 方法才能附加数据到 ABAP 数据对象。

提示

  • 可以将 ABAP 字典中内置类型为 INT2 的指示变量的数据引用传递给 SET_PARAM 方法的可选输入参数 IND_REF。在该数据引用中,值 -1 表示数据库中是否存在空值。
  • 出于安全考虑,最好使用占位符 ? 来设置查询参数,而不是连接动态内容。这也是防止 SQL 注入的一种方法。如果语句只包含程序中的静态内容,而程序外的动态内容只能在操作符位置使用占位符,并且语句不能从外部修改。
  • 在数据库表中的字段和 ABAP 数据对象之间进行赋值时,ABAP 类型和数据库类型之间会发生映射。ABAP 类型应与数据库类型相匹配。如果不匹配,则必须在本地 SQL 接口中进行转换。这些转换与平台有关,并可能引发异常。
  • EXECUTE_QUERY 方法也可用于调用存储过程。在符合要求的数据库中,内部表等可以绑定到结果集。EXECUTE PROCEDURE 方法则无法做到这一点(请参阅该方法下的示例)。
  • 通用方法 EXECUTE 也有一个 CL_SQL_RESULT_SET 类型的返回值,其使用方法与 EXECUTE_QUERY 相同。
  • 在调用具有多个输出参数的数据库存储过程时,可能会出现多个结果。

示例 1:读取数据到工作区

使用 ADBC 从之前使用 ABAP SQL 填充的数据库表中按顺序读取行到工作区。

DELETE FROM demo_update.
INSERT demo_update FROM TABLE @(
  VALUE #( ( id = 'X' col1 = 1 col2 = 2 col3 = 3 col4 = 4 )
           ( id = 'Y' col1 = 5 col2 = 6 col3 = 7 col4 = 8 ) ) ).

DATA result TYPE demo_update.
TRY.
    FINAL(query) = NEW cl_sql_statement( )->execute_query(
       `SELECT client, id, col1, col2, col3, col4 ` &&
       `       FROM demo_update ` &&
       `       WHERE client = '` && sy-mandt && `' `  ).
    query->set_param_struct( struct_ref = REF #( result ) ).
    WHILE query->next( ) > 0.
      cl_demo_output=>write( result ).
    ENDWHILE.
    query->close( ).
  CATCH cx_sql_exception INTO FINAL(exc).
    cl_demo_output=>display( exc->get_text( ) ).
    RETURN.
ENDTRY.

cl_demo_output=>display( ).

示例2:读取数据到内表

DELETE FROM demo_update.
INSERT demo_update FROM TABLE @(
  VALUE #( ( id = 'X' col1 = 1 col2 = 2 col3 = 3 col4 = 4 )
           ( id = 'Y' col1 = 5 col2 = 6 col3 = 7 col4 = 8 ) ) ).

DATA result TYPE TABLE OF demo_update WITH EMPTY KEY.
TRY.
    FINAL(query) = NEW cl_sql_statement( )->execute_query(
       `SELECT client, id, col1, col2, col3, col4 ` &&
       `       FROM demo_update ` &&
       `       WHERE client = '` && sy-mandt && `' `  ).
    query->set_param_table( itab_ref = REF #( result ) ).
    query->next_package( ).
    query->close( ).
  CATCH cx_sql_exception INTO FINAL(exc).
    cl_demo_output=>display( exc->get_text( ) ).
    RETURN.
ENDTRY.

cl_demo_output=>display( result )

还有三个官方可以执行的 Demo,通过 SE38 运行下列程序:

  • DEMO_ADBC_QUERY:ADBC 查询示例,类 CL_SQL_STATEMENT 中的 EXECUTE_QUERY 方法用于读取当前客户端的数据库表 SFLIGHT 中的三列。使用 CL_SQL_RESULT_SET 类中的 SET_PARAM_TABLE 方法将一个适当的内部表绑定到结果集中。使用 NEXT_PACKAGE 方法将结果集中的所有行传送到内部表。
  • DEMO_ADBC_DDL_DML:该程序可创建一个数据库表,其名称可由用户选择。之后,可以向数据库表中插入 100 条记录,读取单个记录,并再次删除数据库表。本地 SQL 语句使用字符串表达式传递给 CL_SQL_STATEMENT 类的方法。
  • DEMO_ADBC_DDL_DML_BULK_ACCESS:该程序可创建和删除数据库表,表名可由用户选择。可以向数据库表中插入行、再次删除行、读取所有行并再次删除数据库表在 DML 语句的所有方法中,参数都使用内部表绑定。
    • 插入(insert)会将内部表中的所有行写入数据库表中,而该表的键值尚未存在。
    • 删除(delete)数据库表中键值出现在内部表中的所有记录。
    • 查询(select )将数据库表中所有行的查询结果集读入内部表。

在这里插入图片描述

参考文档:

  • https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenadbc_query.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/929121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线程信号量 Linux环境 C语言实现

既可以解决多个同类共享资源的互斥问题&#xff0c;也可以解决简易的同步问题 头文件&#xff1a;#include <semaphore.h> 类型&#xff1a;sem_t 初始化&#xff1a;int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…

springboot+mybatis对接使用postgresql中PostGIS地图坐标扩展类型字段

方案一&#xff08;完全集成和自动解析&#xff09;&#xff1a; <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency> 使用 org.postgresql.geometric包下的 PGpoint 类来接收数据库中POINT…

21个Python脚本自动执行日常任务(1)

引言 作为编程领域摸爬滚打超过十年的老手&#xff0c;我深刻体会到&#xff0c;自动化那些重复性工作能大大节省我们的时间和精力。 Python以其简洁的语法和功能强大的库支持&#xff0c;成为了编写自动化脚本的首选语言。无论你是专业的程序员&#xff0c;还是希望简化日常工…

【Python网络爬虫笔记】6- 网络爬虫中的Requests库

一、概述 Requests 是一个用 Python 语言编写的、简洁且功能强大的 HTTP 库。它允许开发者方便地发送各种 HTTP 请求&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并且可以轻松地处理请求的响应。这个库在 Python 生态系统中被广泛使用&#xff0c;无论是简单的网页数…

网站维护记录

服务器重启&#xff0c;网站打不开&#xff1a;chown -R manager:manager /run/php-fpm/www.sock wordpress升级需设置ftp&#xff1a; // 设置权限0777 //define("FS_METHOD", "direct"); //define("FS_CHMOD_DIR", 0777); //define("…

利用Python爬虫精准获得Amazon商品详情数据

在大数据时代&#xff0c;精准的数据获取是电商分析、市场研究和竞争情报收集的关键。Amazon作为全球最大的电商平台之一&#xff0c;其商品详情页面蕴含着丰富的信息。本文将详细介绍如何使用Python爬虫技术精准获取Amazon商品详情数据&#xff0c;并提供实用的代码示例。 1. …

AIGC开始进军网络微短剧!AI会成为影视赛道的新风口吗?

“部分AI元素微短剧更像是一系列炫丽的幻灯片堆砌&#xff0c;技术驱动下的华丽和动感&#xff0c;难以掩盖其作品在内容深度和人文关怀上的缺失&#xff0c;AI微短剧警惕沦为空洞的视觉糖衣。”日前&#xff0c;有专家一针见血地指出。 当下&#xff0c;影视行业正经历着一场…

Kruskal 算法在特定边权重条件下的性能分析及其实现

引言 Kruskal 算法是一种用于求解最小生成树(Minimum Spanning Tree, MST)的经典算法。它通过逐步添加权重最小的边来构建最小生成树,同时确保不会形成环路。在本文中,我们将探讨在特定边权重条件下 Kruskal 算法的性能,并分别给出伪代码和 C 语言实现。特别是,我们将分…

MySQL初学之旅(5)详解查询

目录 1.前言 2.正文 2.1聚合查询 2.1.1count() 2.1.2sum() 2.1.3avg() 2.1.4max() 2.1.5min() 2.1.6总结 2.2分组查询 2.2.1group by字句 2.2.2having字句 2.2.3group by与having的关系 2.3联合查询 2.3.1笛卡尔积 2.3.2内连接 2.3.3外连接 2.3.4自连接 2.3…

【WPS】【EXCEL】将单元格中字符按照分隔符拆分按行填充到其他单元格

问题&#xff1a;实现如下图的效果 解答&#xff1a; 一、函数 IFERROR(TRIM(MID(SUBSTITUTE($A$2,",",REPT(" ",LEN($A$2))),(ROW(A1)-1)*LEN($A$2)1,LEN($A$2))),"") 二、在单元格C2中填写如下函数 三、全选要填充的单元格并且按CTRLD 函数…

WPF+LibVLC开发播放器-进度条显示和拖动控制

进度条显示和拖动控制 视频教程界面上代码实现进度条显示进度进度条拖动视频进度 效果 视频教程 WPFLibVLC开发播放器-进度条控制 界面上 界面上线增加一个Slider控件&#xff0c;当做播放进度条 <SliderName"PlaySlider"Grid.Row"1"Width"800&qu…

可供参考的GitHub国内镜像

在配置了本地hosts文件和魔法后仍存在无法访问的问题 针对如上问题&#xff0c;可以使用国内的镜像地址做替换 例如: https://github.com/bubbliiiing/detr-pytorch改成 https://hub.nuaa.cf/bubbliiiing/detr-pytorch推荐使用的镜像 https://hub.yzuu.cf/ https://hub.nua…

Docker--Docker Registry(镜像仓库)

什么是Docker Registry&#xff1f; 镜像仓库&#xff08;Docker Registry&#xff09;是Docker生态系统中用于存储、管理和分发Docker镜像的关键组件。 镜像仓库主要负责存储Docker镜像&#xff0c;这些镜像包含了应用程序及其相关的依赖项和配置&#xff0c;是构建和运行Doc…

TDesign:Button按钮

Button 按钮 文档地址 view TDButton(text: 确认支付, // 按钮文案isBlock: true, // 是否时Blockwidth:345.w, // 自定义宽度height: 43.w, // 自定义高度padding: EdgeInsets.all(0), // 默认的paddingmargin: EdgeInsets.all(0), // 默认的margin// 文案左侧图标&#xff0c…

DR.KNOWS:医疗图谱UMLS + 图神经网络 + LLM 模拟医生的诊断推理过程, 从症状出发找到可能的诊断结果

DR.KNOWS&#xff1a;医疗图谱UMLS 图神经网络 LLM 模拟医生的诊断推理过程, 从症状出发找到可能的诊断结果 理解要点解法拆解全流程分析图神经网络的训练论文大纲核心模式真实应用中&#xff0c;为什么说俩跳推理过于简化&#xff1f; 论文&#xff1a;Leveraging A Medical…

【Maven系列】深入解析 Maven 镜像配置

前言 Maven 是一个流行的 Java 项目管理和构建工具&#xff0c;可以自动化构建项目、管理依赖、生成报告等。在Maven构建项目时&#xff0c;通常经常需要下载各种依赖。默认情况下&#xff0c;Maven 会从中央仓库下载这些依赖&#xff0c;但在某些情况下&#xff0c;这个过程可…

从智能合约到去中心化AI:Web3的技术蓝图

Web3正在成为互联网发展的重要方向&#xff0c;其核心理念是去中心化、用户主权和自治。随着区块链技术、智能合约以及人工智能&#xff08;AI&#xff09;等技术的发展&#xff0c;Web3不仅重新定义了数据存储和交易方式&#xff0c;还为更智能化、去中心化的数字生态系统铺平…

A1228 php+Mysql旅游供需平台的设计与实现 导游接单 旅游订单 旅游分享网站 thinkphp框架 源码 配置 文档 全套资料

旅游供需平台 1.项目描述2. 开发背景与意义3.项目功能4.界面展示5.源码获取 1.项目描述 随着社会经济的快速发展&#xff0c;生活水平的提高&#xff0c;人们对旅游的需求日益增强&#xff0c;因此&#xff0c;为给用户提供一个便利的查看导游信息&#xff0c;进行导游招募的平…

魔改版kali分享(新增50多种渗透工具)

网盘链接 我用夸克网盘分享了「Kali Linux 定制化魔改系统」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/dda56f7e3431 提取码&#xff1a;…

Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…