将if语句用于游标声明

时间:2010-10-27 19:23:29

标签: sql oracle cursor declaration

我使用游标来查看一些数据,但我需要根据参数声明不同的sql statments。问题似乎是我无法使用if statmets进入这个声明:

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;

我只需要使用if。

更改sql语句

我该怎么做?

TNKS

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

显然,我不知道变量的含义是什么所以我不得不做出一些假设,但我认为这就是你的意思。我也没有保证语法,因为我还没有真正测试过它。

答案 2 :(得分: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表达式 - 当ANSI CASE使用END CASE时,您可以使用END来判断。

您似乎没有发布整个查询 - 我不知道arch来自哪里,也不需要增量变量i ...或者为什么你这样做得到SELECT * FROM TRAFICO,但仅使用id_trafico列...

相关问题