powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Параметризованная вьюшка
19 сообщений из 19, страница 1 из 1
Параметризованная вьюшка
    #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
Параметризованная вьюшка
    #36837944
makitka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
контекст
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36837945
makitka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ставите в сессии контекст, во вьюхе пишете sys_context('userenv', 'имя-пер')
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36837976
wurdu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36837987
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36837989
wurdu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36837992
makitka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wurduJaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?
особо логику вьюхи не изучал но параметра там в case внутри анала
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36837993
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wurduJaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?То, что вьюха выбирает по одной строке, то бишь по сути аггрегация.. Ну или я Вас не понимаю, приведите тогда, как вьюха должна выглядеть...
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36838037
wurdu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaRowurduJaRowurduА почему собственно нельзя условие убрать из view и использовать параметры и условие уже в запросе из view?Ну тогда за этим условием и вся вьюха раскуртится, и смысл в ней исчезнет...А что помешает предикатам передаться во view?То, что вьюха выбирает по одной строке, то бишь по сути аггрегация.. Ну или я Вас не понимаю, приведите тогда, как вьюха должна выглядеть...Согласен. Не внимательно посмотрел на запрос.
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #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
Параметризованная вьюшка
    #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
Параметризованная вьюшка
    #36838131
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pipelined функция?
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #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
Параметризованная вьюшка
    #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
Параметризованная вьюшка
    #36839495
makitka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy, чем контекст не угодил?:)
...
Рейтинг: 0 / 0
Параметризованная вьюшка
    #36839581
Фотография StepanovMD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,

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

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

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

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


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