2016-09-27 1 views
1

Ich habe eine Funktion von Oralce DB erstellt und als Eingabe für Spotfire-Bericht verwendet. Der Grund, warum ich eine Funktion anstelle der Ansicht verwendet habe, liegt darin, dass die Parameter einige komplexe logische Operationen aufwiesen und ich dies in einer Ansicht nicht ausführen konnte.Oracle Funktion erforderlich mit bestimmter Logik in Spotfire zu implementieren

Kommen zu dem Bericht, den ich gebaut habe. Derzeit verwende ich 2 Parameter in der Funktion und ich nehme beide Werte aus dem Spotfire-Textbereich im Data-On-Demand-Modus. Problem ist, dass, wenn ich Werte für beide Parameter nicht gebe ich die Ausgabe nicht. Meine Anforderung ist, dass ich einige weitere Parameter für den Bericht hinzufügen muss, aber ich muss die Funktion und die Einstellungen in Spotfire so einrichten, dass, wenn 5 Parameter vorhanden sind, Benutzer einen Wert für nur einen Parameter eingeben für diesen Parameter. Also müssen die Funktionen so sein, dass wenn ein Wert eingegeben wird, der genommen werden sollte und wenn er leer ist, dann sollte das nicht berücksichtigt werden. Wenn ich den Spotfire-Teil belasse, wenn die Funktion mit den von mir erwähnten Einzelheiten erstellt wird, kann ich sie direkt implementieren.

Ich habe verschiedene Lösungen von überall und ich bin nicht in der Lage, etwas richtig zu implementieren. Ich bin Aktualisierung alle Beispiele und brauchen Hilfe in die richtige herauszufinden und sie zu korrigieren oder sie in eine völlig andere Art und Weise

Code Typ 1 zu tun: zu sein

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; 

Der obige Code scheint ein Beispiel aus MSSQL und ich bin in der Lage, die Logik zu bekommen, aber nicht den richtigen Weg, um in Oracle zu implementieren. Als ich versuchte, habe ich gerade viele Fehler bekommen.

Code Typ 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; 

Im obigen Beispiel i nicht in der Lage bin, die Logik direkt in Spotfire zu implementieren cos es Spalten erfordert die Daten zu erhalten. Letztendlich benötige ich einen Code, der keine Parameter akzeptiert, die vom Benutzer angegeben werden, anstatt nur zu arbeiten, wenn alle Parameter angegeben sind. Es müssen Spalten sichtbar angezeigt werden, da dies in Spotfire Reports implementiert werden kann.

+2

verschiedene x.c1 wählen ... Kommas verpassten zwischen Spalten – leftjoin

Antwort

0

Sie können dies versuchen:

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; 
Verwandte Themen