Report 在交互式报表中模仿PL/SQL返回SQL的更好方法是:收集还是流水线函数

Report 在交互式报表中模仿PL/SQL返回SQL的更好方法是:收集还是流水线函数,report,oracle-apex,pipelined-function,Report,Oracle Apex,Pipelined Function,交互式报表IR最糟糕的方面是不能使用返回SQL语句的PL/SQL创建它。我用两种方法解决了这个问题: 1 APEX_COLLECTION.CREATE_COLLECTION在Before头进程中,它接受在进程中用PL/SQL构造的SQL语句,并使IR的源为select c001 alias1、c002 alias2。。。来自apex_集合a,其中集合_名称='…' 2根据需要制作一个带有参数列表的糟糕管道函数,然后从tablepackage_name中选择IR的源。管道化_函数_name:P1_

交互式报表IR最糟糕的方面是不能使用返回SQL语句的PL/SQL创建它。我用两种方法解决了这个问题:

1 APEX_COLLECTION.CREATE_COLLECTION在Before头进程中,它接受在进程中用PL/SQL构造的SQL语句,并使IR的源为select c001 alias1、c002 alias2。。。来自apex_集合a,其中集合_名称='…'

2根据需要制作一个带有参数列表的糟糕管道函数,然后从tablepackage_name中选择IR的源。管道化_函数_name:P1_参数1,:P1_参数2


是否存在性能差异?我最初使用第一种方法,但后来遇到了一个问题,它给了我一个错误,所以我尝试了管道函数,发现我更喜欢它,并且从那时起就倾向于使用它们,除非这样做不合适,即当有大量项要传递给参数时。

第一种方法为您提供了通过仅在需要时重新创建集合来缓存数据的机会。使用n00X和d00X列将为报表定义提供一些额外的性能和正确的列类型。您还可以基于该集合创建具有类型转换和列别名的视图,以增加更多便利性:

create or replace view apx_my_report
  as
  select n001 id, c001 data, d001 some_date
    from apex_collections
   where collection_name = 'MY_REPORT'
/
在这种情况下,报告来源如下:

select id, data, some_date from apx_my_report
/
另一方面,当每次呈现页面时都需要执行特别查询时,不可避免地会重新创建这样的集合,因此性能会因为不需要的事务维护而下降:撤消、重做等


所以,这要看情况而定。

嘿,Matthew,我也使用了collection变体,但我遇到了另一个问题。如果我使用第1种方法,我就无法制作图表和计算,因为所有cXXXquery返回的20多个COL都是VARCHAR。使用管道函数时是否也包括此行为?@Mario Nope,管道函数将返回正确的数据类型。首先可以生成一行,然后生成这些行的类型表,然后管道函数返回该类型的表。流水线函数对我很有帮助,我建议您在这个用例中使用它们。