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

Abap 如何执行存储在变量中的OpenSQL查询?,abap,opensql,Abap,Opensql,是否可以将串联的select查询存储在变量中并执行??abap变量中是否有任何关键字可以运行字符串???是的,使用viacl\u sql\u语句类进行本机sql注入是可能的,您可以查看internet上的文档。但是,您应该小心,因为本机sql注入可能是危险的。您可以查看演示程序ADBC\u demo DATA: QUERY TYPE STRING, Q2 TYPE STRING, MAINQUERY TYPE STRING. QUERY = 'SELECT MARA~MATNR MA

是否可以将串联的select查询存储在变量中并执行??abap变量中是否有任何关键字可以运行字符串???

是的,使用via
cl\u sql\u语句
类进行本机sql注入是可能的,您可以查看internet上的文档。但是,您应该小心,因为本机sql注入可能是危险的。您可以查看演示程序
ADBC\u demo

 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”关键字。这是一些有用的信息

是的,使用via
cl\u sql\u语句
class进行本机sql注入是可能的,您可以查看internet上的文档。但是,您应该小心,因为本机sql注入可能是危险的。您可以查看演示程序
ADBC\u demo

 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”关键字。这是一些有用的信息

基于Oguz提案的解决方案:

  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( ).
您应该仔细修改SQL查询,因为本机SQL高度依赖于DB后端。例如,查询中的
~
符号与大多数数据库不兼容,列通常需要逗号/大写


有两种方法可以完成这项任务:您也可以使用不推荐的
EXEC-SQL
,或者,但是现在强烈反对使用这些构造。是最简单和最新的,正如Oguz明智地指出的那样。

基于Oguz建议的解决方案:

  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( ).
您应该仔细修改SQL查询,因为本机SQL高度依赖于DB后端。例如,查询中的
~
符号与大多数数据库不兼容,列通常需要逗号/大写


有两种方法可以完成这项任务:您也可以使用不推荐的
EXEC-SQL
,或者,但是现在强烈反对使用这些构造。是最简单和最新的,正如Oguz明智地指出的那样。

…为什么?您计划如何提供适当的目标表?您想要解决的问题是什么?select语句的哪些部分必须是可变的,哪些部分可以固定?…为什么?您计划如何提供适当的目标表?您想要解决的问题是什么?select语句的哪些部分必须是可变的,哪些部分可以固定?