abap - 从 GET_AUTH_VALUES FM 输出构造 SQL 查询
问题描述
我使用结构类型为us335的get_auth_values()的结果。
此结果可以包含单个值或成对的低高值。我想使用这些类似 us335 的结果并执行 SQL 查询。将条目与AND
.
我看到这些方法来解决这个问题:
- 使用 `WHERE COL IN (value1, value2, ...) AND COL <=value3 and col >=value4 ... 创建一个 SQL 查询
- 使用 OpenSQL 特定的IN seltab和我自己的代码创建 SQL 查询(使用 RANGE)
IN seltab
使用特定于内置方法的OpenSQL 创建 SQL 查询(我目前还不知道)
我想还有更多的方法可以解决这个问题。
最可行的方法是什么?
解决方案
组装一个动态的 WHERE 子句。从功能模块开始RH_DYNAMIC_WHERE_BUILD
。如果不合适,请编写一个自己的字符串生成器。
您还可以为动态 IN 子句构建范围,但这会更难。字段类型各不相同,并且由于范围是特定于类型的 ( TYPE RANGE OF <type>
),您最终会得到很多没有乐趣编程的过度动态代码。
在构建 WHERE 子句时,请注意以下细节:
授权中的字段名称可能与您选择的列名称不同。您可能需要映射它们。
授权值可能包含占位符
*
。确保将其转换为 ABAP 运算符CP
或 SQL 运算符LIKE
。如果该值只是一个星号,您可以忽略该条件,因为它不会限制任何内容。功能模块接受最多 20 个字符的值,而授权值最多可以是 40 个字符。如果需要全长,功能模块不足。
类似字符串的字段需要将值括在引号中以获得正确的 SQL 语法,而不能将非字符串值(例如整数)括起来以使选择正确。确保为列的类型选择正确的封闭。
我不确定代码检查器是否认为功能模块的组合是安全的。动态 WHERE 子句是 SQL 注入的潜在入侵点。代码检查器通常拒绝将子句组装委托给其他类的控制流。您可能需要使用 class 的方法添加转义
cl_abap_dyn_prg
。
推荐阅读
- c - 条件跳转或移动取决于带问号的未初始化值
- python - Keras 模型多输入 - 类型错误:('关键字参数不理解:','输入')
- jenkins - 使用具有不同参数的定期构建选项构建 Jenkins 作业
- javascript - 在对象字面量中使用 __proto__
- ios - Swift:打印到任何类型的控制台可变参数
- amazon-web-services - 亚马逊EC2 | CodeDeploy [React] - 部署成功但未填充构建文件夹
- c# - 如何在 Visual Studio Cmdlet DLL 中支持不同的 Powershell 版本
- javascript - DomComplete 事件的事件侦听器未执行
- prolog - 如何在序言中加入规则并打印输出
- vbscript - CreateTextFile 中的 VBScript 权限被拒绝错误 800A0046 突然开始发生