首先给出一般提示:使用dbms_output.put_line 将变量l_sql 输出到控制台,或者使用可以将其插入的某种调试表。还要注意该变量的数据类型。如果您需要扩展 SQL,您可能需要使用 CLOB 变量而不是 varchar2。
如果你想彻底分析你的问题,你需要提供表结构和测试数据,因此我首先给你一些一般性的解释:
Use Generic Column Names 可以,如果您有永久、不可更改的列数。但是,如果您的列的顺序甚至数量可以改变,那么这是一个坏主意,因为如果您的查询结果的列数超过Generic Column Count
,您的页面将显示错误
选项 1:在查询中使用列别名
增强您的PL/SQL Function Body returning SQL Query,使其输出详细的显示名称,如下所示:
return 'select 1 as "Your verbose column name", 2 as "Column #2", 3 as "Column #3" from dual';
看起来像这样:
它的缺点是列名也以这种方式出现在设计器中,如果您重新验证函数,APEX 只会更新这些列名。您将很难在流程代码或动态操作中引用内部名称为 Your verbose column name 的列。
但它仍然有效,即使您在不告诉 APEX 的情况下更改列名,例如通过将 PL/SQL Function Body 外部化为实际函数。
选项 2:使用自定义列标题
有点隐藏,但也有完全自定义列标题的选项。它几乎位于您报告区域的属性页面的末尾。
在这里,您还可以提供一个返回列名的函数。请注意,此函数不应返回本身返回列名的 SQL 查询,而是返回由 冒号 分隔的列名。
使用这种方法,可以更轻松地在设计器中识别和引用您的列:
选项 3:两者兼而有之
关闭通用列名,让您的查询返回易于识别和引用的列名,并使用custom column headings 函数为您的用户返回详细名称。
我的个人意见
我在生产应用程序中使用第三个选项,人们可以使用报表页面上的穿梭项目自己更改列的数量和顺序。这花了一些时间,但现在它就像一个魅力,就像一些动态的PIVOT 没有PIVOT。