以 oracle apex 形式创建动态 where 子句

Posted

技术标签:

【中文标题】以 oracle apex 形式创建动态 where 子句【英文标题】:creating a dynamic where clause in oracle apex form 【发布时间】:2020-05-12 19:42:14 【问题描述】:

我正在创建一个参数化的顶点表单,我通过选择列表从用户那里获取列名及其值。 当我在 where 子句中使用它时,比如

select columnnames 
from table 
where :P592_column = :P592_value ;

它没有返回任何输出,但是当我硬编码列名代替 :P592_column 时,它正在显示输出。

【问题讨论】:

【参考方案1】:

您不能将绑定变量用作动态列名。相反,将CASE 语句中的列列入白名单:

SELECT columnnames 
FROM   table 
WHERE  CASE UPPER( :P592_column )
       WHEN 'COLUMN1' THEN column1
       WHEN 'COLUMN2' THEN column2
       WHEN 'COLUMN3' THEN column3
       WHEN 'COLUMN4' THEN column4
       END = :P592_value;

或者对于多列:

SELECT columnnames 
FROM   table 
WHERE  CASE UPPER( :P592_column )
       WHEN 'COLUMN1' THEN column1
       WHEN 'COLUMN2' THEN column2
       WHEN 'COLUMN3' THEN column3
       WHEN 'COLUMN4' THEN column4
       END LIKE '%' || :P592_value || '%'
AND    CASE UPPER( :P592_column1 )
       WHEN 'COLUMN1' THEN column1
       WHEN 'COLUMN2' THEN column2
       WHEN 'COLUMN3' THEN column3
       WHEN 'COLUMN4' THEN column4
       END LIKE '%' || :P592_value1 || '%'
AND    CASE UPPER( :P592_column2 )
       WHEN 'COLUMN1' THEN column1
       WHEN 'COLUMN2' THEN column2
       WHEN 'COLUMN3' THEN column3
       WHEN 'COLUMN4' THEN column4
       END LIKE '%' || :P592_value2 || '%';

【讨论】:

不过,这可能无法很好地扩展。或者,您可以将 SQL 语句构造为字符串,并将其作为您的区域源返回。 谢谢你们,让我试试这些解决方案。我有多个这样的列。我认为按照scott所说的通过sql过程构造sql会更好 @Scott 如果您尝试通过在过程中使用 DBMS_ASSERT 之类的内容将查询构建为字符串,请确保不要在代码中引入 SQL 注入攻击,并且您可能仍需要白名单/黑名单列名称,如果您不想过滤表中的列。上面的代码没有任何 SQL 注入问题,因为绑定变量值被视为文字并且列是硬编码的。 @MTO :我有很多专栏。多列,例如:P592_COLUMN,:P592_COLUMN1,:P592_COLUMN2,:P592_COLUMN3。而且我必须在 where 子句中使用所有这些列。您能否建议我如何做到这一点,我试图通过 sql 程序来做,但它给了我错误。准确地说,where 子句类似于 :P592_COLUMN like '%:P592_VALUE%' 和 :P592_COLUMN1 like '%:P592_VALUE1% 和 :P592_COLUMN2 like '%:P592_VALUE2% 等等。 如果您正确地使用 PL/SQL 构建 SQL(使用绑定变量),SQL 注入应该与正常编写 SQL 一样多。

以上是关于以 oracle apex 形式创建动态 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

APEX 以表格形式创建动态值列表

Apex Oracle - 多个动态操作

Oracle Apex - 如何使用动态操作更新更改操作的值列表?

Oracle APEX 表格形式选择列表禁用

触发器共同在oracle apex应用程序中工作

如何在动态操作中单击按钮时调用Oracle APEX中的javascript函数?