ABAP ADBC_QUERY 测试代码

项目中使用的接口取数采用的是DBLink的方式,对方提供的表名太长,超过标准程序ADBC_QUERY的参数长度,于是写了一份简单的测试代码用来测试连接和取数。

DBCO配置:

测试程序:

程序源码:

复制代码
*&---------------------------------------------------------------------*
*& Report  ZTEST_ADBC_QUERY
*&
*&---------------------------------------------------------------------*
*&
*& 测试DBLink数据读取
*&---------------------------------------------------------------------*

REPORT ztest_adbc_query.

DATA:
  lo_adbc_connect TYPE REF TO cl_sql_connection,
  lo_adbc_query   TYPE REF TO cl_sql_statement,
  lo_adbc_result  TYPE REF TO cl_sql_result_set,
  lo_metadata     TYPE REF TO data,
  lt_metadata     TYPE adbc_rs_metadata_descr_tab.

DATA:
  lo_sql_exception           TYPE REF TO cx_sql_exception,
  lo_parameter_invalid       TYPE REF TO cx_parameter_invalid,
  lo_parameter_invalid_range TYPE REF TO cx_parameter_invalid_range,
  lo_parameter_invalid_type  TYPE REF TO cx_parameter_invalid_type,
  lo_struct_creation         TYPE REF TO cx_sy_struct_creation,
  lo_table_creation          TYPE REF TO cx_sy_table_creation,
  lo_exception               TYPE REF TO data,
  lv_err_text                TYPE string.

DATA:
  lo_structdescr TYPE REF TO cl_abap_structdescr,
  lo_tabletype   TYPE REF TO cl_abap_tabledescr,
  lo_result_ref  TYPE REF TO data.

FIELD-SYMBOLS:
   <lt_itab> TYPE STANDARD TABLE.

PARAMETERS:
  p_conn TYPE dbcon-con_name,
  p_sql  TYPE string,
  p_upto TYPE i DEFAULT 10.

START-OF-SELECTION.
* 获取连接
  TRY .
      lo_adbc_connect = cl_sql_connection=>get_connection( con_name = p_conn ).
    CATCH cx_sql_exception INTO lo_sql_exception.
      lv_err_text = lo_sql_exception->get_text( ).
      WRITE lv_err_text.
      RETURN.
  ENDTRY.

* 创建连接对象
  lo_adbc_query = lo_adbc_connect->create_statement( ).

* 执行Sql
  TRY .
      lo_adbc_result = lo_adbc_query->execute_query( p_sql ).
    CATCH cx_sql_exception INTO lo_sql_exception.
      lv_err_text = lo_sql_exception->get_text( ).
      WRITE lv_err_text.
      RETURN.
    CATCH cx_parameter_invalid INTO lo_parameter_invalid.
      lv_err_text = lo_parameter_invalid->get_text( ).
      WRITE lv_err_text.
      RETURN.
  ENDTRY.

* 获取元数据
  TRY .
      lt_metadata = lo_adbc_result->get_metadata( ).
    CATCH cx_sql_exception.
      lv_err_text = lo_sql_exception->get_text( ).
      WRITE lv_err_text.
      RETURN.
  ENDTRY.

* 获取元数据字段信息
  TRY .
      lo_metadata = lo_adbc_result->get_struct_ref( md_tab = lt_metadata
                                                   p_strict = abap_false ).
    CATCH cx_sy_struct_creation INTO lo_struct_creation.
      lv_err_text = lo_struct_creation->get_text( ).
      WRITE lv_err_text.
      RETURN.
    CATCH cx_parameter_invalid_range INTO lo_parameter_invalid_range.
      lv_err_text = lo_parameter_invalid_range->get_text( ).
      WRITE lv_err_text.
      RETURN.
  ENDTRY.

* 创建结构类型对象
  lo_structdescr ?= cl_abap_typedescr=>describe_by_data_ref( lo_metadata ).

* 创建表类型对象
  TRY .
      lo_tabletype = cl_abap_tabledescr=>create( p_line_type  = lo_structdescr
                                                 p_table_kind = cl_abap_tabledescr=>tablekind_std ).
    CATCH cx_sy_table_creation INTO lo_table_creation.
      lv_err_text = lo_table_creation->get_text( ).
      WRITE lv_err_text.
      RETURN.
  ENDTRY.

* 创建表对象引用
  CREATE DATA lo_result_ref TYPE HANDLE lo_tabletype.

* 传递sql结果至表对象引用
  TRY .
      lo_adbc_result->set_param_table( itab_ref = lo_result_ref ).
    CATCH cx_parameter_invalid INTO lo_parameter_invalid.
      lv_err_text = lo_parameter_invalid->get_text( ).
      WRITE lv_err_text.
      RETURN.
  ENDTRY.

* 获取所有数据
  TRY .
      lo_adbc_result->next_package( EXPORTING upto = p_upto ).
    CATCH cx_sql_exception INTO lo_sql_exception.
      lv_err_text = lo_sql_exception->get_text( ).
      WRITE lv_err_text.
      RETURN.
    CATCH cx_parameter_invalid_type INTO lo_parameter_invalid_type.
      lv_err_text = lo_parameter_invalid_type->get_text( ).
      WRITE lv_err_text.
      RETURN.
  ENDTRY.

* 关闭连接
  lo_adbc_result->close( ).

* 赋值到动态内表
  ASSIGN lo_result_ref->* TO <lt_itab>.

  cl_demo_output=>display( <lt_itab> ).
相关推荐
Irene19914 小时前
大数据开发语境下,SQL 模式名,映射关系 - - 概念理解
大数据·数据库·sql
ffqws_7 小时前
MyBatis 动态 SQL 详解:从原理到实战
java·sql·mybatis
其实防守也摸鱼9 小时前
《SQL注入进阶实验:基于sqli-Labs的报错注入(Error-Based Injection)实战解析》
网络·数据库·sql·安全·网络安全·sql注入·报错注入
juniperhan9 小时前
Flink 系列第20篇:Flink SQL 语法全解:从 DDL 到 DML,窗口、聚合、列转行一网打尽
大数据·数据仓库·分布式·sql·flink
duangww10 小时前
OPEN SQL去掉文本中间的空格
数据库·abap
Gauss松鼠会10 小时前
GaussDB数据库统计信息自动收集机制
数据库·经验分享·sql·oracle·gaussdb
消失的旧时光-194310 小时前
SQL 怎么学(工程实战总纲|用一套用户模型打穿全流程)
java·数据库·sql
鸽芷咕12 小时前
KingbaseES与Oracle兼容性深度解析:数据类型、内置函数、PL/SQL全面对比
数据库·sql·oracle
小羽网安15 小时前
从零开始学习 sql 注入,常见的 sql 注入解析
数据库·sql·学习
小徐敲java1 天前
踩坑实录:MySQL8.0 导入SQL报错 2006 - MySQL server has gone away 完美解决
数据库·sql