2010-10-27 6 views
1

Si vous utilisez un curseur pour parcourir certaines données, je dois déclarer plusieurs instructions sql en fonction d'un paramètre. Le problème semble être que Im pas en mesure d'utiliser si statmets dans ce declaratios:Utilisation d'une instruction if dans une déclaration de curseur

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; 

J'ai juste besoin de changer la requête SQL en utilisant un si.

Comment est-ce que je fais ceci?

tnks

+0

Si je me souviens bien, vous pouvez utiliser CASE – ika

Répondre

4

essayez d'utiliser un curseur REF curseur dynamique (je suppose TripoConsulta est une variable et non l'un des prédicats de la requête):

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; 

de toute évidence, je ne sais pas ce que tout cela veut dire la variable donc je devais faire un certain nombre d'hypothèses, mais je pense que c'est ce que vous vouliez dire. Je ne guaranetee pas aussi la syntaxe puisque je ne l'ai pas réellement testé.

+0

Tnks cela fonctionne bien –

4

Je pense que vous pourriez vouloir essayer ce qui suit:

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

Valide, mais pas sargable. –

2

Il utilise les curseurs implicites, plutôt que écharde un curseur explicite avec une clause OR ou utiliser SQL dynamique:

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; 

Il utilise également une expression CASE PLSQL, plutôt que l'expression CASE ANSI - vous pouvez dire par l'utilisation de END CASE, lorsque ANSI CASE utilise simplement END.

Il ne semble pas que vous avez publié toute requête - je ne sais pas où arch vient, ni la nécessité de la variable incrémenter i ... Ou pourquoi vous avez SELECT * FROM TRAFICO mais seulement en utilisant la id_trafico colonne ...