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注入是可能的。