由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( ).