Spotfire文本区域参数的可选数据输入来自Oracle函数

时间:2016-09-22 10:14:16

标签: oracle spotfire

我已经从Oralce DB创建了一个函数,并将其用作Spotfire报告的输入。我使用函数而不是视图的原因是因为参数有一些复杂的逻辑操作,我无法在视图中完成。

来到我建立的报告。目前我在函数中使用了2个参数,我在数据点播模式下从Spotfire文本区域获取两个值。所以我设置了两个输入字段'获取数据。问题是,除非我输入两个参数的值,否则我不会得到输出。我的要求是我需要为报告添加更多参数,但我需要在Spotfire中设置功能和设置,如果有5个参数,如果用户只为一个参数输入一个值报告应该运行对于该参数。我知道使用复杂的logis设置的参数是存在的,但我还需要添加其他参数并确保它正常工作。我不了解proc,以防使用该解决方案实现。

我不能回去使用视图,因为那样不会给我想要的结果。需要任何想法或建议来实现它。如果我需要发布更多信息,请告诉我。

这是我在oracle中实现的方式:

 create or replace function Function_test(p1 varchar2='',p2 varchar2='',p3 varchar2)
      return SYS_REFCURSOR as
      my_cursor SYS_REFCURSOR;
    begin
      open my_cursor for

    select distinct

               x.c1
               x.c2
               x.c3
               from x
               where x.c1=p3
               and (p1='' or x.c2=p1)
               and (p2='' or x.c3=p2);

      return my_cursor;
    end;  

1 个答案:

答案 0 :(得分:1)

使用STORED PROCEDURETABLE VALUED FUNCTION会在此处获得类似的结果,您可以使用其中任何一个。我知道您无法使用VIEW因为VIEWS无法使用参数。在使用PROCEDURES时,我更喜欢VIEWS而不是SPOTFIRE,因为如果您需要向PROCEDURE添加列或参数,INFORMATION LINK上的PROCEDURE 1}}将继承这些更改,而在INFORMATION LINK上使用VIEW时,更改不会级联,您需要一起重新创建INFORMATION LINK。< / p>

对于你的情况,我会建议一些事情。由于您尝试将某些参数设为可选,因此您需要对FUNCTIONPROCEDURE进行编码以接受此操作。例如,假设一个参数是@param1,这是接受来自{$propertyControl1}的输入。要使此选项成为可选项,如果用户不希望将其用于限制结果,则需要指示用户将属性控件留空。同时,在FUNCTIONPROCEDURE中,您需要将其默认值设为''。以下是使用SQL Server的情况,但ORACLE

应该类似
CREATE FUNCTION dbo.MyFunction (@param1 VARCHAR(256) = '') --default value is blank. Remember don't use NULL since your property control can't be NULL
RETURNS
@returnTBL TABLE(
   Column1 datetime,
   Column2 int,
   Column3 varchar(16))
AS
BEGIN
   INSERT INTO @returnTBL (Column1, Column2, Column3)
   SELECT
       c.C1
       c.C2
       c.C3
   FROM Table2
   WHERE @param1 = '' OR c.C3 = @param1   --this returns all rows if the user passes in blank, and filters on it if they pass in a value
RETURN
END

或者,类似地,使用STORED PROCEDURE

中的SQL Server的逻辑相同
CREATE PROCEDURE dbo.MyProcedure(@param1 VARCHAR(256) = '') --default value is blank. Remember don't use NULL since your property control can't be NULL
AS

SELECT
   c.C1
   c.C2
   c.C3
FROM Table2
WHERE @param1 = '' OR c.C3 = @param1   --this returns all rows if the user passes in blank, and filters on it if they pass in a value
GO

最后,由于您有多个参数,我不会自动刷新按需数据。我将让用户单击刷新按钮来检索数据。这将阻止每次更改单个参数时执行FUNCTION。如果用户需要更改5个参数中的3个,那么实际上只需要执行一次,而不是三次。