不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名
Posted
技术标签:
【中文标题】不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名【英文标题】:Can't use bind variable as table name in sql query APEX ORACLE 【发布时间】:2018-05-17 20:04:31 【问题描述】:SELECT * FROM :TABLENAME
是我的查询,Apex 不允许我运行,因为应用程序不知道表名。如何使用变量作为表名动态查询。
【问题讨论】:
【参考方案1】:方法如下:
使用虚拟 SELECT 语句创建经典报表,例如select * from dual
在该页面上创建一个文本项,我们称之为 P22_TABLE_NAME
将其“按下输入时提交”属性设置为“是”
编辑报告源并将类型设置为PL/SQL Function Body 返回 SQL Query
函数体应该是return 'select * from ' || :P22_TABLE_NAME;
将“使用通用列名”属性设置为“是”,因为您使用不同的表名,而且所有表名(很可能)都有不同的列
运行页面;当您将不同的表名放入 P22_TABLE_NAME 项目并按 Enter 键时,报告内容应该会改变
【讨论】:
这会受到 SQL 注入的影响吗? 是的,您应该使用 dbms_assert.sql_object_name,但前提是您首先要询问为什么要动态确定表 stevenfeuersteinonplsql.blogspot.com.au/2017/08/… 我同意你们两个。好吧,这是最简单的方法(至少,我认为是这样)。它可以完成的事实并不意味着它应该完成。我不记得我曾经需要做类似的事情,除了娱乐(比如在论坛上回答问题),我不知道它会用来做什么。【参考方案2】:您应该知道表单可能需要查询哪些表。如果您有一个名为 TABLE_NAME
的应用程序项,您可以将结果合并在一起并选择正确的表,如下所示:
select col1, col2, col3 from tablex where :TABLE_NAME = 'TABLEX'
union all
select col1, col2, col3 from tabley where :TABLE_NAME = 'TABLEY'
union all
select col1, col2, col3 from tablez where :TABLE_NAME = 'TABLEZ'
这种方法的好处是可以检查查询的语法是否正确,并且表具有正确的列;并且此解决方案不受 SQL 注入攻击。
缺点是如果添加了新表,则必须修改查询。但是,如果您像这样动态创建表格,那么您无论如何都应该考虑修改您的策略。
【讨论】:
以上是关于不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名的主要内容,如果未能解决你的问题,请参考以下文章
在 oracle apex 中将 sql 查询重写为 pl/sql
如何在 oracle apex 18 中编辑交互式网格(带有复杂的 sql 查询)?
Oracle APEX - 将隐藏的 SQL 查询下载到 CSV