powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что происходит при попытке использовать связываемые переменные? И как решить задачу?
4 сообщений из 4, страница 1 из 1
Что происходит при попытке использовать связываемые переменные? И как решить задачу?
    #39946585
velikiyxela
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток всем.

Весрия СУБД: oracle 10g2

Есть такой запрос:

Код: plsql
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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
select ayear, nvl(sum_jan, 0) sum_jan, nvl(sum_feb, 0) sum_feb, nvl(sum_mar, 0) sum_mar, nvl(sum_apr, 0) sum_apr, nvl(sum_may, 0) sum_may, 
nvl(sum_jun, 0) sum_jun, nvl(sum_jul, 0) sum_jul, nvl(sum_aug, 0) sum_aug, nvl(sum_sep, 0) sum_sep, nvl(sum_oct, 0) sum_oct, 
nvl(sum_nov, 0) sum_nov, nvl(sum_dec, 0) sum_dec from
(
select coalesce(mar_year, apr_year) ayear, 
sum_jan, sum_feb, sum_mar, sum_apr, sum_may, sum_jun, sum_jul, sum_aug, sum_sep, sum_oct, sum_nov, sum_dec 
from (
	select extract(year from d.doc_date) jan_year, sum(d.sum) sum_jan 
	from document d
	where	extract(month from d.doc_date) = &jan
	group by extract(year from d.doc_date)
) vt_jan full outer join 
(
	select extract(year from d.doc_date) feb_year, sum(d.sum) sum_feb 
	from document d
	where	extract(month from d.doc_date) = &feb
	group by extract(year from d.doc_date)
)vt_feb on vt_jan.jan_year = vt_feb.feb_year full outer join (
	select extract(year from d.doc_date) mar_year, sum(d.sum) sum_mar 
	from document d
	where	extract(month from d.doc_date) = &mar
	group by extract(year from d.doc_date)
)vt_mar on vt_mar.mar_year = vt_feb.feb_year full outer join (
	select extract(year from d.doc_date) apr_year, sum(d.sum) sum_apr
	from document d
	where	extract(month from d.doc_date) = &apr
	group by extract(year from d.doc_date)
)vt_apr on vt_apr.apr_year = vt_mar.mar_year full outer join (
	select extract(year from d.doc_date) may_year, sum(d.sum) sum_may 
	from document d
	where	extract(month from d.doc_date) = &may
	group by extract(year from d.doc_date)
)vt_may on vt_apr.apr_year = vt_may.may_year full outer join (
	select extract(year from d.doc_date) jun_year, sum(d.sum) sum_jun
	from document d
	where	extract(month from d.doc_date) = &jun
	group by extract(year from d.doc_date)
)vt_jun on vt_jun.jun_year = vt_may.may_year full outer join (
	select extract(year from d.doc_date) jul_year, sum(d.sum) sum_jul
	from document d
	where	extract(month from d.doc_date) = &jul
	group by extract(year from d.doc_date)
)vt_jul on vt_jul.jul_year = vt_jun.jun_year full outer join (
	select extract(year from d.doc_date) aug_year, sum(d.sum) sum_aug
	from document d
	where	extract(month from d.doc_date) = &aug
	group by extract(year from d.doc_date)
)vt_aug on vt_aug.aug_year = vt_jul.jul_year full outer join (
	select extract(year from d.doc_date) sep_year, sum(d.sum) sum_sep
	from document d
	where	extract(month from d.doc_date) = &sep
	group by extract(year from d.doc_date)
)vt_sep on vt_sep.sep_year = vt_aug.aug_year full outer join (
	select extract(year from d.doc_date) oct_year, sum(d.sum) sum_oct
	from document d
	where	extract(month from d.doc_date) = &oct
	group by extract(year from d.doc_date)
)vt_oct on vt_oct.oct_year = vt_sep.sep_year full outer join (
	select extract(year from d.doc_date) nov_year, sum(d.sum) sum_nov
	from document d
	where	extract(month from d.doc_date) = &nov
	group by extract(year from d.doc_date)
)vt_nov on vt_nov.nov_year = vt_oct.oct_year full outer join (
	select extract(year from d.doc_date) dec_year, sum(d.sum) sum_dec
	from document d
	where	extract(month from d.doc_date) = &dec
	group by extract(year from d.doc_date)
)vt_dec on vt_dec.dec_year = vt_nov.nov_year
) vt_grouped
order by vt_grouped.ayear



Выполняется он примерно 15 - 20 мин, и память жрёт гигами. Но работает правильно. Понятное дело, я ОЧЕНЬ хочу использовать связываемые переменные (не подстановочные, они мне никак не помогли). То есть

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
var jan number --вместо &jan
var feb number --вместо &jfeb
var mar number --вместо &mar
-- and so on... после чего
exec :jan := 1;
exec :feb := 2;
exec :mar := 3;
-- и т. д.



Беда, однако: из объявленных переменных видит oracle только первую. Остальные для нее просто не существуют, и она ругается, что они не объявлены.

Допустим, не объявлены. Я в SQL Developer даю ей возможность самостоятельно запросить значения переменных. Запрашивает. Но:

- если я использовал 1 связываемую переменную, то всё норм, запрос выполнен, и очень быстро. Но мне надо 12 переменных.

- если я определяю в тексте запроса более 1 переменной - ОШИБКА ORA-00600 (все параметры пустые - [], [], [], [], [], []), и экземпляр падает. После этого без перезапуска даже не коннектится к нему. То же самое происходит при попытке определить 1 переменную, и с её помощью получить требуемые значения (:jan + :jan, :jan + :jan + :jan, и т. д.).

Вот теперь, уважаемые знатоки, вопросы:
- как определить и использовать 2 и более связываемых переменных в Oracle?
- почему мой экземпляр Oracle не позволяет определить более 1 связываемой переменной? От чего это зависит и можно ли это исправить? Если да, то как именно?
- как ускорить выполнение запроса без использования связываемых переменных? Это, наверное, совсем уж глупо, но если не будет другого выхода - надо что - то искать....

Каюк мозгу уже. Не вижу, на что смотреть ещё.
...
Рейтинг: 0 / 0
Что происходит при попытке использовать связываемые переменные? И как решить задачу?
    #39946600
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
velikiyxela,

вам вообще не нужны бинды в таком запросе. Погуглите-почитайте про pivot/unpivot.
Т.к. у вас старый оракл придется использовать старые способы, например:
Код: plsql
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.
select 
  ayear,
  nvl(sum(decode(amonth, 1,asum)),0) mon1,
  nvl(sum(decode(amonth, 2,asum)),0) mon2,
  nvl(sum(decode(amonth, 3,asum)),0) mon3,
  nvl(sum(decode(amonth, 4,asum)),0) mon4,
  nvl(sum(decode(amonth, 5,asum)),0) mon5,
  nvl(sum(decode(amonth, 6,asum)),0) mon6,
  nvl(sum(decode(amonth, 7,asum)),0) mon7,
  nvl(sum(decode(amonth, 8,asum)),0) mon8,
  nvl(sum(decode(amonth, 9,asum)),0) mon9,
  nvl(sum(decode(amonth,10,asum)),0) mon10,
  nvl(sum(decode(amonth,11,asum)),0) mon11,
  nvl(sum(decode(amonth,12,asum)),0) mon12
from (
     select
        extract(year from d.doc_date) ayear,
        extract(month from d.doc_date) amonth,
        sum(d.sum) asum
     from
        document d
     group by
        extract(year from d.doc_date),
        extract(month from d.doc_date)
) vt_grouped
group by ayear
order by vt_grouped.ayear;

...
Рейтинг: 0 / 0
Что происходит при попытке использовать связываемые переменные? И как решить задачу?
    #39946610
velikiyxela
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender, какое тебе огромное спасибо! А мне, старому ослу, кол осиновый в голову, чтобы не забывал про простые способы и не пытался решать задачи "в лоб"!!!
...
Рейтинг: 0 / 0
Что происходит при попытке использовать связываемые переменные? И как решить задачу?
    #39946975
sharkoff76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
velikiyxela,
Это все нагромаждение кода вроде можно заменить:

Код: plsql
1.
2.
3.
4.
SELECT trunc(d.doc_date, 'mm') , SUM(d.sum) s_s
  FROM document d
 WHERE d.doc_date BETWEEN bla AND blabla
 GROUP BY trunc(d.doc_date, 'mm');



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


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