【问题标题】:interactive report with dynamic sql statement带有动态 sql 语句的交互式报表
【发布时间】:2021-04-23 15:07:37
【问题描述】:

我正在尝试在 Apex 中使用位于页面项 (:P10_SQL) 中的 SQL 语句生成交互式报告,例如:select 1 from dual。

declare
 l_sql VARCHAR2(4000 CHAR); 
Begin
select V('P10_SQL') into l_sql from dual;
return l_sql;
End;

报表的类型为 PL/SQL 函数体,返回 SQL 查询。 Apex 显示错误 ORA-20999: WWV_FLOW_EXEC.NULL_QUERY_RETURNED_BY_FUNCTION

有人有想法吗?

【问题讨论】:

  • 项目P10_SQL 有值吗?为什么不直接做return v('P10_SQL'); 甚至return :P10_SQL;
  • 在调试问题时尝试return nvl(:P10_SQL, 'select ''no value'' as col_header from dual'); 可能会有所帮助
  • 我也试过 v('P10_SQL') 和 :P10_SQL 没有成功。页面项目中有一个值。它不是源数据库列,而是获取从另一个页面项粘贴的计算值。
  • 你如何确定 P10_SQL 中有一个值?如果在页面上显示P10_SQL,查询是否出现?
  • 你不应该在你的应用程序中使用 V() 函数。该函数适用于 apex 会话上下文中不存在的数据库对象 - 它比仅将应用程序作为绑定变量引用要慢得多(使用 :P10_SQL 而不是 V('P10_SQL')。

标签: oracle plsql report oracle-apex interactive


【解决方案1】:

Apex 有点疯狂,因为它并不总是想接受我写的代码(这是完全有效的),说函数不返回任何东西。哦,好吧。

因此,我的返回 SQL 查询的函数是分阶段编写的。以下项目符号代表我所做的尝试;他们都没事。最终版本 - 现在运行的版本就像 return :P77_SQL; 一样简单(我在页面 77

  • return 'select dummy from dual'
    
  • declare
      l_str varchar2(4000);
    begin
      l_str := case when :P77_SQL is null then 'select dummy from dual'
                    else :P77_SQL
               end;
      return l_str;
    end;
    
  • return :P77_SQL;
    

但是:您不能使用交互式报表,必须是经典报表,因为并非所有作为源的表都具有相同的列名(除非您使用别名并匹配数字和数据类型,比较复杂)。

但是,如果您使用经典报告,请打开“使用通用列名”并设置所需的通用列数(我将其设置为 10;您会知道在您的情况下该怎么做)。

当我按下ENTER 时,我的P77_SQL 文本项会提交页面,这会导致报告刷新。

几个例子:

【讨论】:

  • 这是意料之中的,不是疯狂的 - 当您在 APEX 构建器环境中编辑 IR 时,它必须运行查询以确定列列表 - 但此时 没有用户session 所以P10_SQL 的定义是null,所以函数没有返回有效的SQL 查询。正如您所指出的,您需要为 APEX 提供 something,因此使用 NVL 返回默认查询是正确的方法。
  • 啊哈。知道了。谢谢你,@Jeffrey。
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2017-01-09
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多