Использование if if в объявлении курсора - PullRequest
1 голос
/ 27 октября 2010

Я использую курсор, чтобы просмотреть некоторые данные, но мне нужно объявить различные SQL-отчеты в соответствии с параметром. Кажется, проблема в том, что я не могу использовать статметы в этих декларациях:

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, используя if.

Как мне это сделать?

TNKS

Ответы [ 3 ]

4 голосов
/ 27 октября 2010

попробуйте использовать динамический курсор 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;

Ясно, что я не знаю, что все переменныезначит, мне пришлось сделать ряд предположений, но я думаю, это то, что вы имели в виду.Я также не гарантирую синтаксис, так как фактически не проверял его.

4 голосов
/ 27 октября 2010

Я думаю, вы можете попробовать следующее:

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;
2 голосов
/ 27 октября 2010

При этом используются неявные курсоры, а не разделение явного курсора с помощью предложения 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 ...

...