ADBC:根据SQL Select的字段返回动态内表

 由cl_sql_result_set->get_struct_ref 可以返回SQL结果集中内表的字段引用。然后根据

cl_abap_structdescr,cl_abap_tabledescr得到cl_abap_datadescr类型的引用。

如下例,select 字段有四个:CARRID,CONNID,AIRPFROM, AIRPTO ,那么lr_table_ref的类型就是这四个字段组成的内表。


DATA:
  lv_con_name         TYPE dbcon-con_name,
  lr_cx_sql_exception TYPE REF TO cx_sql_exception,
  lr_connection       TYPE REF TO cl_sql_connection,
  lr_statement        TYPE REF TO cl_sql_statement,
  lr_result_set       TYPE REF TO cl_sql_result_set,
  lv_sql              TYPE string,
*  lt_data             TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY,
  lr_data             TYPE REF TO data.
DATA:lr_param1 TYPE REF TO data.
DATA:BEGIN OF ls_in,
       mandt  TYPE spfli-mandt,
       carrid TYPE spfli-carrid,
     END OF ls_in..

START-OF-SELECTION.
  lv_con_name = 'DEFAULT'.
  TRY.
      lr_connection = cl_sql_connection=>get_connection( lv_con_name ).
    CATCH cx_sql_exception INTO lr_cx_sql_exception.
*     error occured
  ENDTRY.

  lr_statement = lr_connection->create_statement(  ).
  lv_sql = ` SELECT CARRID,CONNID,AIRPFROM, AIRPTO FROM SPFLI WHERE MANDT = ? AND CARRID = ?`.
*  lr_statement->set_param( REF #( sy-mandt ) ).
*  lr_statement->set_param( REF #( 'LH' ) ).
  ls_in-mandt = sy-mandt.
  ls_in-carrid = 'LH'.
  lr_statement->set_param_struct( REF #( ls_in ) ).
  lr_result_set   = lr_statement->execute_query( lv_sql ).

  DATA(lr_struct_ref) = lr_result_set->get_struct_ref( lr_result_set->get_metadata( ) ).
  DATA: lr_line_type TYPE REF TO cl_abap_datadescr.
  lr_line_type ?= cl_abap_structdescr=>describe_by_data_ref( lr_struct_ref ).
  DATA(lr_table_ref) = cl_abap_tabledescr=>create(
          p_line_type  = lr_line_type  ).

  CREATE DATA lr_data TYPE HANDLE lr_table_ref.
  lr_result_set->set_param_table( lr_data ).
  lr_result_set->next_package( ).
  lr_result_set->close( ).
*  cl_demo_output=>display( lt_data ).
  ASSIGN lr_data->* TO FIELD-SYMBOL(<fs_itab>).
  cl_demo_output=>display( <fs_itab> ).
  lr_connection->close( ).

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值