Abap 在OpenSQL中的动态WHERE中引用参数

Abap 在OpenSQL中的动态WHERE中引用参数,abap,opensql,Abap,Opensql,我发现了这个示例,其中介绍了如何创建动态模型: REPORT ZII_RKP_TEST1. DATA: cond(72) TYPE c, itab LIKE TABLE OF cond. PARAMETERS: source(10) TYPE c, dest(10) TYPE c. DATA wa TYPE spfli-cityfrom. CONCATENATE 'CITYFROM = ''' source '''' INTO cond. APPEND cond TO ita

我发现了这个示例,其中介绍了如何创建动态模型:

REPORT ZII_RKP_TEST1.

DATA: cond(72) TYPE c,
      itab LIKE TABLE OF cond.

PARAMETERS: source(10) TYPE c, dest(10) TYPE c.

DATA wa TYPE spfli-cityfrom.

CONCATENATE 'CITYFROM = ''' source '''' INTO cond.
APPEND cond TO itab.

CONCATENATE 'OR CITYFROM = ''' dest '''' INTO cond.
APPEND cond TO itab.

CONCATENATE 'OR CITYFROM = ''' 'BAYERN' '''' INTO cond.
APPEND cond TO itab.

LOOP AT itab INTO cond.
  WRITE cond.
ENDLOOP.

SKIP.

SELECT cityfrom
  INTO wa
  FROM spfli
 WHERE (itab).
   WRITE / wa.
ENDSELECT.
资料来源:

上面的例子使用了静态值,比如“拜仁”,但如果我使用任意值,那么我想一些特殊值可能会出现问题,比如
'


有必要做一些引用,使动态在哪里牢不可破?如果是,怎么做?

在添加它们之前,您可以在perform中避开撇号,如下所示

PERFORM escape CHANGING source.
PERFORM escape CHANGING dest.

CONCATENATE 'CITYFROM = ''' source '''' INTO cond.
APPEND cond TO itab.

...

FORM escape CHANGING value TYPE c.
  REPLACE ALL OCCURRENCES OF '''' IN value WITH ''''''.
ENDFORM.
最新的ABAP版本包括转义函数详细信息。但它不包括在内。我们可以在类cl_abap_dyn_prg上使用静态escape_quotes方法,如下所示

CALL METHOD cl_abap_dyn_prg=>escape_quotes
  EXPORTING
    val    = source
  receiving
    out    = output. 

方法使上面的内容看起来像执行的一样。

我想知道为什么这个示例是这样写的,可能是一段旧代码

第一:如果您可以在系统中访问“新”字符串语法,您可以使用

WHERE = |CITYFROM = '| && source && |'|.
WHERE = 'CITYFROM = source'.
第二:stringwhere子句的好处在于,您可以将变量用作字符串的一部分,我的意思是,如果您只编写

WHERE = |CITYFROM = '| && source && |'|.
WHERE = 'CITYFROM = source'.
ABAP会将其转换为正确的SQL,就像您正确编写SQL一样


(我希望我能正确地解释自己,如果你有任何疑问,请毫不犹豫地询问)

应该使用方法
cl\u abap\u dyn\u prg=>quote(name)

例如:

DATA(cond) = `country = 'DE' AND name = ` &&
             cl_abap_dyn_prg=>quote( name ).
资料来源:


感谢Sandra Rossi为我指明了正确的方向。

转义只处理标记(HTML/XML)、JSON和URL。我认为没有办法逃避SQL。至少这是我在你提供的链接中看到的。但也许我是瞎子。是的,你是对的。我创建了另一个类方法并将其添加到我的答案中;它提供了转义值的方法,特别是用于防止SQL注入的方法,cf。我猜在您的回答中,SQL注入是可能的。