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.是否可以将连接的select查询存储在变量中并执行??在abap的变量中有运行字符串的关键字吗??
发布于 2017-07-12 14:41:55
是的,使用via cl_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( ).还有另一种方法,那就是动态创建select查询,但您必须键入"select“关键字。Here是一些有用的信息。
发布于 2017-07-18 21:38:04
基于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高度依赖于DB-backend。例如,查询中的~符号与大多数数据库不兼容,并且列通常需要逗号/大写。
有几种方法可以完成此任务:您也可以使用过时的EXEC SQL或generate subroutine pool,但目前强烈不鼓励使用这些构造。正如Oguz明智地指出的那样,ABDC是最简单和最新的。
https://stackoverflow.com/questions/45036292
复制相似问题