【问题标题】:Can't use bind variable as table name in sql query APEX ORACLE不能在 sql 查询 APEX ORACLE 中使用绑定变量作为表名
【发布时间】:2018-05-17 20:04:31
【问题描述】:
SELECT * FROM :TABLENAME 

是我的查询,Apex 不允许我运行,因为应用程序不知道表名。如何使用变量作为表名动态查询。

【问题讨论】:

    标签: sql oracle plsql oracle-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 注入攻击。

    缺点是如果添加了新表,则必须修改查询。但是,如果您像这样动态创建表格,那么您无论如何都应该考虑修改您的策略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 2012-10-19
      相关资源
      最近更新 更多