Как я могу сделать этот запрос более общим? - PullRequest
0 голосов
/ 14 января 2011

У меня есть запрос:

select 
  some_id
from 
  tablename t
where 
  t.end_date < current_date
  and not exists (
    select null
    from tablename ti
    where ti.end_date > t.end_date
      and ti.some_id = t.some_id
      and ti.some_criteria = t.some_criteria
  )

Как я могу изменить это так, чтобы я мог запросить его для любой даты, не меняя запрос внутри?(замените «current_date» значением)

Я не ищу ответ PL / SQL, так как хочу показать это ...

Ответы [ 3 ]

4 голосов
/ 14 января 2011

Хотя вы сказали, что не хотите использовать PL / SQL, лучшим вариантом будет создание (конвейерной) табличной функции.

Это немного сложнее в настройке, чем представление, но после создания вы можете использовать функцию «как» для представления с параметрами:

SELECT *
FROM table(get_stuff(current_date));

Вот несколько примеров:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_packages.htm#sthref1054
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/tuning.htm#sthref2351
http://psoug.org/reference/pipelined.html
http://www.oracle.com/technology/sample_code/tech/pl_sql/htdocs/x/Table_Functions_Cursor_Expressions/Pipelined_Table_Functions.htm

0 голосов
/ 14 января 2011

Вы можете использовать переменную пакета и функцию пакета вместе с представлением. Переменная пакета установлена ​​на уровне сеанса, поэтому может быть разной для разных сеансов.

Создать спецификацию пакета

create or replace package pkg_current_date is

  current_date date;
  function get_current_date return date;

end pkg_current_date;

И корпус упаковки:

create or replace package body pkg_current_date is

    function get_current_date return date is

  begin
    return current_date;
  end;


end pkg_current_date;

Затем используйте функцию, созданную в представлении

CREATE VIEW v1
as
select 
  some_id
from 
  tablename t
where 
  t.end_date < pkg_current_date.get_current_date;

Чтобы запросить представление, просто установите дату, а затем запросите. Возможно, стоит установить какую-то дату по умолчанию, иначе представление ничего не даст, так как current_date будет нулевым.

begin
  pkg_current_date.current_date := date '2010-01-01'
end;

select * from v1
0 голосов
/ 14 января 2011
  • ОБНОВЛЕНО # 2

Единственный параметр даты в этой строке

t.end_date < current_date

Так что есть все, что вам нужно изменить без изменения внутреннего запроса. Если вы имеете в виду, что представление

CREATE VIEW v1
as
select 
  some_id
from 
  tablename t
where 
  t.end_date < current_date
  and not exists (
    select null
    from tablename ti
    where ti.end_date > t.end_date
      and ti.some_id = t.some_id
      and ti.some_criteria = t.some_criteria
  )

И вы хотите иметь возможность использовать что-то вроде этого

select * from v1 where end_date < current_date-7

Не уверен, что Oracle сможет встроить фильтр в представление, но вы можете попробовать это (удалить фильтр). Хотя функция может работать лучше, чем представление.

CREATE VIEW v1
as
select 
  some_id
from 
  tablename t
where not exists (
    select null
    from tablename ti
    where ti.end_date > t.end_date
      and ti.some_id = t.some_id
      and ti.some_criteria = t.some_criteria
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...