ABAP-- 动态 SQL 类 CL_SQL_STATEMENT ,cl_demo_output

ABAP–原生SQL接口API(ADBC)的使用
sap为大家提供原生SQL(Native SQL)接口API,该接口主要由四个类组成:

CL_SQL_STATEMENT - Execution of SQL Statements
CL_SQL_PREPARED_STATEMENT - Prepared SQL Statements
CL_SQL_CONNECTION - Administration of Database Connections
CX_SQL_EXCEPTION - Exception Class

动态 sql 语句

DATA: lr_sql_result TYPE REF TO cl_sql_result_set,
sql TYPE REF TO cl_sql_statement,
tab_ref TYPE REF TO data,
gt_components TYPE cl_abap_structdescr=>component_table,
gs_components LIKE LINE OF gt_components,
v_rows TYPE i.
CREATE OBJECT sql.

DATA : lt_meta TYPE adbc_rs_metadata_descr_tab,
lt_column TYPE adbc_column_tab,
ls_meta LIKE LINE OF lt_meta,
ls_column LIKE LINE OF lt_column,
lv_type TYPE abap_typekind.
FIELD-SYMBOLS :

TYPE ANY TABLE.
TRY.

lr_sql_result = sql->execute_query( 'SELECT * FROM T001  ' ).
lt_meta = lr_sql_result->get_metadata( ).

LOOP AT lt_meta INTO ls_meta.
  ls_column = ls_meta-column_name.
  APPEND ls_column TO lt_column.
  gs_components-name = ls_meta-column_name.
  •      GS_COMPONENTS-TYPE ?= CL_ABAP_DATADESCR=>DESCRIBE_BY_DATA( P_DATA = LS_META-DATA_TYPE ).
    IF to_upper( ls_meta-data_type ) = 'STRING' .
      lv_type = 'g'.
    ELSE.
      lv_type = ls_meta-data_type.
    ENDIF.
    
    
    gs_components-type ?= cl_abap_elemdescr=>get_by_kind(
                            p_type_kind = lv_type
                            p_length    = ls_meta-length
                            p_decimals  = ls_meta-decimals                     ).
    APPEND gs_components TO gt_components.
    

    ENDLOOP.

    DATA lr_tabledescr TYPE REF TO cl_abap_tabledescr.

    lr_tabledescr = cl_abap_tabledescr=>create(
    p_line_type = cl_abap_structdescr=>create( p_components = gt_components ) ).

    CREATE DATA tab_ref TYPE HANDLE lr_tabledescr.

  • get REFERENCE OF LT_DATA INTO tab_ref.
    lr_sql_result->set_param_table(
    EXPORTING
    itab_ref = tab_ref " Reference to Output Variable
    corresponding_fields = lt_column ).

**Execute the query
lr_sql_result->next_package( ).
v_rows = lr_sql_result->next( ).

ASSIGN tab_ref->* TO <table>.
  • MOVE-CORRESPONDING [] TO it_query[].
    CATCH cx_root INTO DATA(lv_error).
  •   ROLLBACK WORK.
    
  • e_code = 1.
    DATA(e_msg) = ‘获取记录不存在:’ && lv_error->get_text( ).
    RETURN.

ENDTRY.
lr_sql_result->close( ).

**cl_demo_output **

SELECT *
FROM scarr
INTO TABLE @DATA(carriers).
CALL TRANSFORMATION id SOURCE carriers = carriers

                   RESULT XML DATA(xml).

cl_demo_output=>begin_section( Some Text ).

cl_demo_output=>write_text( |blah blah blah \n| &&

                        |blah blah blah| ).

cl_demo_output=>next_section( Some Data ).

cl_demo_output=>begin_section( Elementary Object ).

cl_demo_output=>write_data( carriers[ 1 ]-carrid ).

cl_demo_output=>next_section( Internal Table ).

cl_demo_output=>write_data( carriers ).

cl_demo_output=>end_section( ).

cl_demo_output=>next_section( XML ).

cl_demo_output=>write_xml( xml ).

cl_demo_output=>display( ).

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值