以 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 子句的主要内容,如果未能解决你的问题,请参考以下文章