我从Oralce DB创建了一个函数,并将其用作Spotfire报告的输入。我使用函数而不是视图的原因是因为参数有一些复杂的逻辑操作,而我无法在视图中完成。
来看看我建立的报告。目前我在函数中使用2个参数,我在按需数据模式下从Spotfire文本区域获取两个值。所以我已经设置了两个"输入字段"获取数据。问题是,除非我为两个参数输入值,否则我不会得到输出。我的要求是,我需要为报告添加更多的参数,我可以,但我需要在Spotfire中设置功能和设置,这样,如果有5个参数,如果用户输入一个值,只有一个参数报告应该为该参数运行。我知道用复杂逻辑设置的参数在那里,但我还需要添加额外的参数,并确保它正常工作。我不知道过程,如果一个解决方案是可以实现的。
我不能回去使用视图,因为它不会给我想要的结果。需要任何想法或建议来实现它。如果我需要发布其他信息,请告诉我。
在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;
在这里使用STORED PROCEDURE
或TABLE VALUED FUNCTION
将获得类似的结果,您可能可以使用其中任何一个。我知道你不能用VIEW
因为VIEWS
不能有参数。在使用SPOTFIRE
时,我更喜欢PROCEDURES
而不是VIEWS
,因为如果您需要向PROCEDURE
添加列或参数,那么PROCEDURE
上的INFORMATION LINK
将继承这些更改,而在VIEW
上使用INFORMATION LINK
,更改将不会级联下来,您需要一起重新创建INFORMATION LINK
。
FUNCTION
或PROCEDURE
进行编码以接受这一点。例如,假设一个参数是@param1
,它接受来自{$propertyControl1}
的输入。为了使成为可选的,如果用户不希望使用来限制结果,则需要指示用户将属性控件留空。同时,在FUNCTION
或PROCEDURE
中,您需要将其默认值设置为''
。下面是使用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
或者,类似地,这里是相同的逻辑,在SQL Server
中使用STORED PROCEDURE
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个,您实际上只希望执行一次,而不是执行三次。