从 Oracle 函数获取的 Spotfire 文本区域参数的可选数据输入
Optional Data Input into Spotfire Text Area parameters got from a Oracle Function
我从 Oralce DB 创建了一个函数并将其用作 Spotfire 报告的输入。我使用函数而不是视图的原因是因为参数有一些复杂的逻辑操作,而我无法在视图中完成。
来到我建立的报告。目前我在函数中使用了 2 个参数,并且我在按需数据模式下从 Spotfire 文本区域获取两个值。所以我设置了两个 'Input Field' 来获取数据。问题是,除非我为两个参数都输入值,否则我不会得到输出。我的要求是我需要为报告添加更多参数,但我需要在 Spotfire 中设置功能和设置,这样如果有 5 个参数,如果用户只为一个参数输入一个值,报告应该 运行 该参数。我知道那里有使用复杂逻辑设置的参数,但我还需要添加其他参数并确保它正常工作。我不知道 proc 是否可以使用它来实现解决方案。
我无法返回使用视图,因为那不会给我想要的结果。需要任何想法或建议来实施它。如果我需要 post 其他信息,请告诉我。
这就是我在 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
添加列或参数,您的 INFORMATION LINK
在 PROCEDURE
将继承这些更改,而在 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 个,您实际上只希望它执行一次,而不是三次。
我从 Oralce DB 创建了一个函数并将其用作 Spotfire 报告的输入。我使用函数而不是视图的原因是因为参数有一些复杂的逻辑操作,而我无法在视图中完成。
来到我建立的报告。目前我在函数中使用了 2 个参数,并且我在按需数据模式下从 Spotfire 文本区域获取两个值。所以我设置了两个 'Input Field' 来获取数据。问题是,除非我为两个参数都输入值,否则我不会得到输出。我的要求是我需要为报告添加更多参数,但我需要在 Spotfire 中设置功能和设置,这样如果有 5 个参数,如果用户只为一个参数输入一个值,报告应该 运行 该参数。我知道那里有使用复杂逻辑设置的参数,但我还需要添加其他参数并确保它正常工作。我不知道 proc 是否可以使用它来实现解决方案。
我无法返回使用视图,因为那不会给我想要的结果。需要任何想法或建议来实施它。如果我需要 post 其他信息,请告诉我。
这就是我在 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
添加列或参数,您的 INFORMATION LINK
在 PROCEDURE
将继承这些更改,而在 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 个,您实际上只希望它执行一次,而不是三次。