2010-10-27 37 views
1

使用遊標來查看一些數據,但我需要根據參數聲明不同的sql語句。這個問題似乎是,林沒有到這個declaratios能夠使用,如果statmets:在遊標聲明中使用if語句

DECLARE 
    CURSOR c IS SELECT * FROM TRAFICO 
       IF TipoConsulta = 'mes' then 
      BEGIN 
      WHERE TO_CHAR(FECHA_BUSQUEDA, 'MM-YYYY') =To_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM-YYYY')     
      ELSE     
       WHERE FECHA_BUSQUEDA >= SYSDATE -7     
      END IF; 
      ORDER BY ID_TRAFICO; 
begin 
    FOR r IN C LOOP 
     BEGIN 
      Utl_File.Put_Line(Arch, r.ID_TRAFICO); 
      i:=i+1;   
     END; 
    END LOOP; 
END; 

我只需要改變使用如果SQL statment。

我該怎麼做?

TNKS

+0

如果我沒有記錯的話,你可以使用CASE – ika 2010-10-27 19:25:51

回答

4

嘗試使用動態遊標REF CURSOR(我假設TripoConsulta是一個變量,而不是的謂詞之一查詢):

declare 
type some_cursor is ref cursor; 
my_cursor some_cursor; 
my_rec trafico%rowtype; 

begin 

    if TripoConsulta = 'mes' then 
    open my_cursor for select * from trafico where ...; 
    else 
    open my_cursor for select * from trafico where ...; 
    end if; 
    loop 
    fetch my_cur into my_rec; 
    exit when my_cur%notfound; 
    Utl_File.Put_Line(my_rec.Arch, my_cur.ID_TRAFICO); 
    end loop; 
    close my_cursor; 
end; 

清楚,我不知道該變量的所有意思,所以我不得不什麼做出一些假設,但我想這是你的意思。我也沒有保證語法,因爲我沒有真正測試過它。

+0

它運作良好 – 2010-10-28 15:51:03

4

我想你可能想嘗試以下操作:

SELECT * FROM TRAFICO 
WHERE (TipoConsulta = 'mes' 
     and TO_CHAR(FECHA_BUSQUEDA, 'MM-YYYY') =To_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM-YYYY')) 
    or (TipoConsulta <> 'mes' 
     and FECHA_BUSQUEDA >= SYSDATE -7) 
ORDER BY ID_TRAFICO; 
+0

有效,但不可sargable。 – 2010-10-27 19:51:39

2

這裏使用隱式遊標,而不是分裂顯式遊標與or子句或使用動態SQL:

CASE TipoConsulta 
    WHEN 'mes' THEN 
    FOR b IN (SELECT a.* 
       FROM TRAFICO a 
       WHERE TO_CHAR(a.fecha_busqueda, 'MM-YYYY') = To_CHAR(ADD_MONTHS(SYSDATE, -1), 'MM-YYYY') 
      ORDER BY a.id_trafico) 
     UTL_FILE.PUT_LINE(Arch, b.id_trafico); 
    END LOOP; 
    ELSE 
    FOR d IN (SELECT c.* 
       FROM TRAFICO c 
       WHERE c.fecha_busqueda >= SYSDATE - 7 
      ORDER BY c.id_trafico) 
     UTL_FILE.PUT_LINE(Arch, d.id_trafico); 
    END LOOP; 
END CASE; 

這也採用了PLSQL CASE表達式,而不是ANSI CASE表達式 - 你可以告訴通過使用END CASE,當ANSI CASE只使用END時。

它不會出現,您張貼整個查詢 - 我不知道在哪裏arch是從哪裏來的,也不需要進行遞增變量i ...或者爲什麼你有SELECT * FROM TRAFICO,但只能用id_trafico列...