DATA: QUERY TYPE STRING,
Q2 TYPE STRING,
MAINQUERY TYPE STRING.
QUERY = 'SELECT MARA~MATNR MARA~MBRSH MARA~MTART MARA~ERSDA MARA~PACKCODE FROM MARA INTO TABLE ITAB'.
Q2 = 'WHERE MARA~MBRSH = IDNAME.'.
CONCATENATE QUERY Q2 INTO MAINQUERY.
WRITE: /3 MAINQUERY.
MAINQUERY.
是否可以将串联的选择查询存储在变量中并执行?是否有任何关键字可以在 abap 的变量中运行字符串?
是的,使用 viacl_sql_statement
类进行本机 sql 注入是可能的,您可以在互联网上查看文档。但是,您应该小心,因为本机 sql 注入可能很危险。您可以查看演示程序ADBC_DEMO
。
DATA: con_ref TYPE REF TO cl_sql_connection,
l_sqlerr_ref TYPE REF TO cx_sql_exception.
DATA:
l_stmt TYPE string,
l_stmt_ref TYPE REF TO cl_sql_statement.
CREATE OBJECT con_ref.
con_ref = cl_sql_connection=>get_connection( ).
" create a statement object
l_stmt_ref = con_ref->create_statement( ).
"Create query
CONCATENATE
'insert into' p_tabsim 'select * from' p_tabreal
INTO l_stmt SEPARATED BY space.
TRY .
l_stmt_ref->execute_update( l_stmt ).
CATCH cx_sql_exception INTO l_sqlerr_ref.
MESSAGE 'Problem' TYPE 'W'.
* RAISE EXCEPTION l_sqlerr_ref.
ENDTRY.
con_ref->commit( ).
con_ref->close( ).
还有另一种方法是动态选择查询创建,但您必须键入"选择"关键字。以下是一些有用的信息。
基于Oguz提议的解决方案:
TYPES: BEGIN OF ty_result,
matnr TYPE mara-matnr,
mbrsh TYPE mara-mbrsh,
mtart TYPE mara-mtart,
ersda TYPE mara-ersda,
packcode TYPE mara-packcode,
END OF ty_result.
DATA:
lt_result TYPE TABLE OF ty_result,
lo_result_set TYPE REF TO cl_sql_result_set,
lx_sql TYPE REF TO cx_sql_exception.
DATA: QUERY TYPE STRING,
Q2 TYPE STRING,
MAINQUERY TYPE STRING.
QUERY = | SELECT MATNR, MBRSH, MTART, ERSDA, PACKCODE FROM MARA |.
Q2 = | WHERE MBRSH = 'M' |.
CONCATENATE QUERY Q2 INTO MAINQUERY.
TRY.
lo_result_set = NEW cl_sql_statement( )->execute_query( mainquery ).
lo_result_set->set_param_table( REF #( lt_result ) ).
" Get result
lo_result_set->next_package( ).
lo_result_set->close( ).
CATCH cx_sql_exception INTO lx_sql.
" Error handling
WRITE: lx_sql->get_text( ).
ENDTRY.
IF lt_result IS NOT INITIAL.
DATA: o_alv TYPE REF TO cl_salv_table.
DATA: lx_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_alv
CHANGING
t_table = lt_result ).
CATCH cx_salv_msg INTO lx_msg.
ENDTRY.
ENDIF.
o_alv->display( ).
您应该仔细修改您的 SQL 查询,因为本机 SQL 高度依赖于数据库后端。例如,查询中的~
符号与大多数数据库不兼容,并且列通常需要逗号/大写。
有几种方法可以完成此任务:您也可以使用已弃用的EXEC SQL
,或生成子例程池,但现在强烈建议不要使用这些构造。ABDC是最简单和最新的,正如Oguz明智地指出的那样。