首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何执行存储在变量中的OpenSQL查询?

如何执行存储在变量中的OpenSQL查询?
EN

Stack Overflow用户
提问于 2017-07-11 21:43:51
回答 2查看 2.1K关注 0票数 1
代码语言:javascript
复制
 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的变量中有运行字符串的关键字吗??

EN

回答 2

Stack Overflow用户

发布于 2017-07-12 14:41:55

是的,使用via cl_sql_statement类的原生sql注入是可能的,你可以在互联网上查看文档。但是,您应该小心,因为原生sql注入可能是危险的。您可以查看演示程序ADBC_DEMO

代码语言:javascript
复制
  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是一些有用的信息。

票数 0
EN

Stack Overflow用户

发布于 2017-07-18 21:38:04

基于Oguz建议的解决方案:

代码语言:javascript
复制
 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 SQLgenerate subroutine pool,但目前强烈不鼓励使用这些构造。正如Oguz明智地指出的那样,ABDC是最简单和最新的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45036292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档