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> ).
相关推荐
小火柴0121 小时前
SQL高级语法
数据库·sql
Satan7128 小时前
【MySQL】DML数据操作语句和基本的DQL语句
数据库·sql·mysql
jnrjian8 小时前
Oracle 19C archivelog 还是不可以pdb级别设置, standby db可以
sql·oracle
什么鬼昵称9 小时前
Pikachu-Sql-Inject -基于boolian的盲注
数据库·sql
颜淡慕潇9 小时前
【数据库】Java 集成mongodb— MongoTemplate 详解
java·数据库·sql·mongodb·nosql
知识分享小能手9 小时前
mysql学习教程,从入门到精通,SQL 表的创建(33)
大数据·开发语言·数据库·sql·学习·mysql·数据库开发
YMZN919 小时前
基于SSM+微信小程序的校园二手数码交易平台系统(二手3)(源码+sql脚本+视频导入教程+文档)
sql·微信小程序·小程序
binbinxyz10 小时前
一个简单的SQL面试题
数据库·sql
bug菌¹12 小时前
滚雪球学MySQL[7.2讲]:MySQL安全策略详解:数据加密与SQL注入防护
数据库·sql·mysql
小安运维日记18 小时前
Linux云计算 |【第四阶段】RDBMS1-DAY3
运维·服务器·sql·mysql·云计算·求职招聘