首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenSQL中引用动态其中的参数

在OpenSQL中引用动态其中的参数
EN

Stack Overflow用户
提问于 2018-10-02 10:47:49
回答 3查看 3K关注 0票数 2

我在下面的示例中找到了如何创建动态位置的示例:

代码语言:javascript
复制
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.

来源:https://wiki.scn.sap.com/wiki/display/ABAP/Dynamic%2Bwhere%2Bclause

上面的示例使用诸如"BAYERN“这样的静态值,但是如果我使用任意值,那么我猜对于一些特殊的值(如''' ),情况可能会中断。

是否有必要做一些引用,使动态哪里不可打破?如果是的话,怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-08 09:47:13

应该使用cl_abap_dyn_prg=>quote( name )方法。

示例:

代码语言:javascript
复制
DATA(cond) = `country = 'DE' AND name = ` &&
             cl_abap_dyn_prg=>quote( name ).

来源:使用动态令牌的SQL注入

感谢桑德拉·罗西为我指明了正确的方向。

票数 1
EN

Stack Overflow用户

发布于 2018-10-02 11:32:37

您可以在“执行”中避开撇号,然后添加如下所示

代码语言:javascript
复制
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版本包括转义函数的详细信息是这里。但它不包括引号转义。我们可以在类escape_quotes上使用静态cl_abap_dyn_prg方法,如下所示。

代码语言:javascript
复制
CALL METHOD cl_abap_dyn_prg=>escape_quotes
  EXPORTING
    val    = source
  receiving
    out    = output. 

方法将类似于上面的内容执行。

票数 2
EN

Stack Overflow用户

发布于 2018-10-04 06:58:23

我想知道为什么这个例子是这样写的,也许它是一段旧代码。

第一:如果您的系统中有访问“新”字符串语法的权限,则只需使用以下内容

代码语言:javascript
复制
WHERE = |CITYFROM = '| && source && |'|.

第二: string WHERE子句的好处是,您只需使用变量作为字符串的一部分,我的意思是,如果您只编写类似的内容

代码语言:javascript
复制
WHERE = 'CITYFROM = source'.

ABAP将将其转换为适当的SQL,就好像您正在正确地编写SQL一样。

(我希望我能正确地解释自己,不要犹豫,问你是否有任何疑问)

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

https://stackoverflow.com/questions/52606842

复制
相关文章

相似问题

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