2016-09-27 98 views
1

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

来到我已经建成的报告。目前,我在该功能中使用了2个参数,并且我正在采用Data on Demand模式中的Spotfire文本区域的值。问题是,除非我输入两个参数的值我不会得到输出。我的要求是,我需要为报告添加更多参数,但我需要设置Spotfire中的函数和设置,以便如果有5个参数,如果用户只输入一个参数报告应该运行为那个参数。所以函数需要这样的一种方式,即如果输入的值应该被采用,并且如果它留空,那么就不应该被考虑。离开Spotfire的一部分,如果功能与我所提到的具体细节我可以直接实施。

我已经得到了不同的解决方案,我无法正确实施任何操作。我更新所有的例子,需要搞清楚正确的,纠正,或做在一个完全不同的方式

代码类型1的帮助:

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; 

上面的代码似乎是从MSSQL的例子,我能够得到的逻辑,但不知道在Oracle中实现的正确方法。当我尝试时,我得到了很多错误。

代码类型2:

create or replace function Function_delete(param1 Varchar2, param2 varchar2) 
    RETURN Varchar2 IS 
    ssql varchar2(3000); 
    test varchar2(1000); 
begin 
    ssql := 'select col1,col2 from table_x'; 
if param1 is null and param2 is not null then 
    ssql := ssql || ' Where col2='''|| param2 ||''''; 
    end if; 
    if param1 is not null and param2 is null then 
    ssql := ssql || ' Where col3= ''' || param1 ||''''; 
    end if; 
    if param1 is not null and param2 is not null then 
    ssql := ssql || ' Where col3 = ''' || param1 || ''' and col2='''|| param2 ||''''; 
    end if; 
    dbms_output.put_line(ssql); 
    execute immediate ssql into test; 
    return test; 
--EXCEPTION 
-- WHEN OTHERS THEN 
    -- return 'Hello'; 
end Function_delete; 

在上面的例子COS它需要的列来获取数据我不能够实现在Spotfire的逻辑正确的。最终我需要一个代码,它不接受用户给出的参数,而不是仅在给出所有参数时才工作。它需要显示可见的列,因为这样我可以在Spotfire报告中实施相同的功能。

+2

选择不同x.c1 ...逗号列之间错过 – leftjoin

回答

0

你可以试试这个:

create or replace function Function_test(p1 in varchar2,p2 in varchar2,p3 in varchar2) 
     return SYS_REFCURSOR as 
     my_cursor SYS_REFCURSOR; 
    begin 
     open my_cursor for 
    select 
    1 
    from 
    dual 
    where 1=1 
    and '1'=p1 
    and '2'=p2 
    and '3'=p3 ; 

     return my_cursor; 
    end;