Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Параметризованная вьюшка / 19 сообщений из 19, страница 1 из 1
09.09.2010, 13:26
    #36837940
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
В отчете есть такой подзапрос.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    SELECT id
      FROM (
        SELECT 
           p.id
           , ROW_NUMBER() OVER (
               PARTITION BY p.obj_id 
               ORDER BY 
                 CASE 
                   WHEN TRUNC(SYSDATE) > TO_DATE('01.08.2010', 'DD.MM.YYYY')
                   THEN - 1  * TO_NUMBER(TO_CHAR(p.work1, 'J'))
                   ELSE TO_NUMBER(TO_CHAR(p.work1, 'J'))
                 END
             ) rn
           FROM obj o
             JOIN obj_params p
               ON o.id = p.obj_id
                 AND TO_DATE('01.08.2010', 'DD.MM.YYYY') between trunc(o.work0, 'MM') AND o.work1
           WHERE TO_DATE('01.08.2010', 'DD.MM.YYYY') BETWEEN TRUNC(p.work0, 'MM') AND p.work1
      ) WHERE rn =  1    
, где TO_DATE('01.08.2010', 'DD.MM.YYYY') - это приходящий параметр.

Этот подзапрос нужно добавить в еще несколько отчетов, поэтому мне бы хотелось как-то его выделить. Насколько я понял, вьюшку с параметрами создать не получится. Пробовал запихать его в pl/sql функцию, возвращающую TYPE NUMBER_ARRAY AS TABLE OF NUMBER. С функцией запросы ачали работать в 2-2,5 раза медленнее. Собственно, вопрос в следующем: как наиболее оптимально реализовать то, что я хочу.
...
Рейтинг: 0 / 0
09.09.2010, 13:28
    #36837944
makitka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
контекст
...
Рейтинг: 0 / 0
09.09.2010, 13:30
    #36837945
makitka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
ставите в сессии контекст, во вьюхе пишете sys_context('userenv', 'имя-пер')
...
Рейтинг: 0 / 0
09.09.2010, 13:43
    #36837976
wurdu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
А почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?
...
Рейтинг: 0 / 0
09.09.2010, 13:48
    #36837987
JaRo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
wurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...
...
Рейтинг: 0 / 0
09.09.2010, 13:51
    #36837989
wurdu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
JaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?
...
Рейтинг: 0 / 0
09.09.2010, 13:52
    #36837992
makitka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
wurduJaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?
особо логику вьюхи не изучал но параметра там в case внутри анала
...
Рейтинг: 0 / 0
09.09.2010, 13:53
    #36837993
JaRo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
wurduJaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?То, что вьюха выбирает по одной строке, то бишь по сути аггрегация.. Ну или я Вас не понимаю, приведите тогда, как вьюха должна выглядеть...
...
Рейтинг: 0 / 0
09.09.2010, 14:15
    #36838037
wurdu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
JaRowurduJaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?То, что вьюха выбирает по одной строке, то бишь по сути аггрегация.. Ну или я Вас не понимаю, приведите тогда, как вьюха должна выглядеть...Согласен. Не внимательно посмотрел на запрос.
...
Рейтинг: 0 / 0
09.09.2010, 14:20
    #36838051
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
JaRoНу или я Вас не понимаю, приведите тогда, как вьюха должна выглядеть...
Вот упрощенный вид таблицы obj_params
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select 
    rownum pid
  , t.* 
  from (
    select  1  id, TO_DATE('01.01.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 from dual
    union all
    select  2  id, TO_DATE('01.01.2010', 'DD.MM.YYYY') w0, TO_DATE('03.08.2010', 'DD.MM.YYYY') w1 from dual
    union all
    select  2  id, TO_DATE('04.08.2010', 'DD.MM.YYYY') w0, TO_DATE('31.08.2010', 'DD.MM.YYYY') w1 from dual
    union all
    select  2  id, TO_DATE('01.09.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 from dual
    union all
    select  3  id, TO_DATE('06.08.2010', 'DD.MM.YYYY') w0, TO_DATE('10.09.2010', 'DD.MM.YYYY') w1 from dual
    union all
    select  3  id, TO_DATE('11.09.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 from dual
  ) t
Вьюха должна вернуть ид параметров действующих на переданную дату (в первом посте это 01.08.2010), но с таким условием, что если переданная дата ранее текущей, то вернуть надо последний действующий параметр в пределах месяца переданной даты. Иначе - ближайший из действующих к переданной дате.
...
Рейтинг: 0 / 0
09.09.2010, 14:25
    #36838059
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
Вот упрощенный вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
    SELECT id
      FROM (
        SELECT 
           p.id
           , ROW_NUMBER() OVER (
               PARTITION BY p.obj_id 
               ORDER BY 
                 CASE 
                   WHEN TRUNC(SYSDATE) > TO_DATE('01.08.2010', 'DD.MM.YYYY')
                   THEN - 1  * TO_NUMBER(TO_CHAR(p.w1, 'J'))
                   ELSE TO_NUMBER(TO_CHAR(p.w1, 'J'))
                 END
             ) rn
           FROM (
             SELECT 
                 ROWNUM id
               , t.* 
               FROM (
                 SELECT  1  obj_id, TO_DATE('01.01.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 FROM dual
                 UNION ALL
                 SELECT  2  obj_id, TO_DATE('01.01.2010', 'DD.MM.YYYY') w0, TO_DATE('03.08.2010', 'DD.MM.YYYY') w1 FROM dual
                 UNION ALL
                 SELECT  2  obj_id, TO_DATE('04.08.2010', 'DD.MM.YYYY') w0, TO_DATE('31.08.2010', 'DD.MM.YYYY') w1 FROM dual
                 UNION ALL
                 SELECT  2  obj_id, TO_DATE('01.09.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 FROM dual
                 UNION ALL
                 SELECT  3  obj_id, TO_DATE('06.08.2010', 'DD.MM.YYYY') w0, TO_DATE('10.09.2010', 'DD.MM.YYYY') w1 FROM dual
                 UNION ALL
                 SELECT  3  obj_id, TO_DATE('11.09.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 FROM dual
               ) t
           ) p
           WHERE TO_DATE('01.08.2010', 'DD.MM.YYYY') BETWEEN TRUNC(p.w0, 'MM') AND p.w1
      ) WHERE rn =  1   
...
Рейтинг: 0 / 0
09.09.2010, 14:49
    #36838131
JaRo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
pipelined функция?
...
Рейтинг: 0 / 0
09.09.2010, 14:53
    #36838142
StepanovMD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
JaRo,


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Connected to Oracle Database 10g Enterprise Edition Release  10 . 2 . 0 . 2 . 0  
Connected as Mosk
 
SQL> 
SQL> select id from
   2   (
   3    SELECT id , MyTdate
   4         FROM (
   5           SELECT
   6              p.id
   7   					 , MyTdate
   8              , ROW_NUMBER() OVER (
   9                  PARTITION BY p.obj_id
  10                  ORDER BY
  11                    CASE
  12                      WHEN TRUNC(SYSDATE) > MyTdate
  13                      THEN - 1  * TO_NUMBER(TO_CHAR(p.w1, 'J'))
  14                      ELSE TO_NUMBER(TO_CHAR(p.w1, 'J'))
  15                    END
  16                ) rn
  17              FROM (
  18                SELECT
  19                    ROWNUM id
  20   							, MyTdate
  21                  , t.*
  22                  FROM (
  23                    SELECT  1  obj_id, TO_DATE('01.01.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 FROM dual
  24                    UNION ALL
  25                    SELECT  2  obj_id, TO_DATE('01.01.2010', 'DD.MM.YYYY') w0, TO_DATE('03.08.2010', 'DD.MM.YYYY') w1 FROM dual
  26                    UNION ALL
  27                    SELECT  2  obj_id, TO_DATE('04.08.2010', 'DD.MM.YYYY') w0, TO_DATE('31.08.2010', 'DD.MM.YYYY') w1 FROM dual
  28                    UNION ALL
  29                    SELECT  2  obj_id, TO_DATE('01.09.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 FROM dual
  30                    UNION ALL
  31                    SELECT  3  obj_id, TO_DATE('06.08.2010', 'DD.MM.YYYY') w0, TO_DATE('10.09.2010', 'DD.MM.YYYY') w1 FROM dual
  32                    UNION ALL
  33                    SELECT  3  obj_id, TO_DATE('11.09.2010', 'DD.MM.YYYY') w0, TO_DATE('31.12.2099', 'DD.MM.YYYY') w1 FROM dual
  34                  ) t,
  35   							(select TO_DATE('01.08.2010', 'DD.MM.YYYY') MyTdate from dual union all
  36   							select TO_DATE('01.08.2010', 'DD.MM.YYYY') + 1  MyTdate from dual union all
  37   							select TO_DATE('01.08.2010', 'DD.MM.YYYY')+ 2  MyTdate from dual )  MyT
  38   						 ) p
  39              WHERE MyTdate BETWEEN TRUNC(p.w0, 'MM') AND p.w1
  40         ) WHERE rn =  1   )
  41   			where MyTdate=TO_DATE('01.08.2010', 'DD.MM.YYYY')
  42   /
 
        ID
----------
          1 
          3 
          5 
...
Рейтинг: 0 / 0
10.09.2010, 05:41
    #36839286
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
StepanovMD,

Чего-то я не совсем понял. А как я вот эту часть во вьшку запихну?
Код: plaintext
1.
2.
3.
(select TO_DATE('01.08.2010', 'DD.MM.YYYY') MyTdate from dual union all
select TO_DATE('01.08.2010', 'DD.MM.YYYY') + 1  MyTdate from dual union all
select TO_DATE('01.08.2010', 'DD.MM.YYYY')+ 2  MyTdate from dual )  MyT
Ведь TO_DATE('01.08.2010', 'DD.MM.YYYY') может поменяться на любую другую дату.
...
Рейтинг: 0 / 0
10.09.2010, 10:10
    #36839495
makitka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
aleksandy, чем контекст не угодил?:)
...
Рейтинг: 0 / 0
10.09.2010, 10:39
    #36839581
StepanovMD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
aleksandy,

Да запихни любую таблицу с непрерывными датами - не индустриально - но раз ты жутко не хочешь использовать контекст и при этом всеже вынести запрос во вьюшку - то это выход.
...
Рейтинг: 0 / 0
10.09.2010, 10:42
    #36839592
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
makitka,

контекст всем угодил. :) Просто предложили другое решение, на мой взгляд какое-то неоптимальное, но все же... Хотелось понять его...
...
Рейтинг: 0 / 0
10.09.2010, 10:50
    #36839621
Data corruption
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
не знаю как тынц делать, но тема 99% подходит под вашу

http://www.sql.ru/Forum/actualthread.aspx?tid=706733&pg=1&mid=7846093
...
Рейтинг: 0 / 0
10.09.2010, 17:22
    #36840955
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметризованная вьюшка
Data corruptionне знаю как тынц делать

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Параметризованная вьюшка / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]