Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странности вывода / 14 сообщений из 14, страница 1 из 1
27.04.2017, 09:09
    #39445181
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Добрый день, я уже неоднократно обращался сюда. У меня есть три огромные функции, которые динамически скачут по столбцам таблицы ГРАФИК и вытаскивают те значения, которые помеченные особой литерой (у - учебный отпуск, о - просто отпуск, б - больничный). Каждая функция отвечает за вывод определённого отпуска, причём в виде интервала дат первой и последней недели отпуска. Теперь вопрос.

Теперь такой вопрос. В таблице график у меня 3 записи, где указаны отпуска 3 разных людей. Если допустим я вывожу одного, то он вытаскивает 3 СТРОКИ, причём одинаковых по содержанию. Почему так происходит?

Вот коды функции

Эта ищет учебный отпуск:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace FUNCTION get_week_list3(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''у'') THEN '||''''|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||''''|| '||''; '' ELSE NULL END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;



Эта просто отпуска

Код: 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.
create or replace FUNCTION
 week_fun2(i_code IN INTEGER, i_year in integer)
RETURN VARCHAR2 IS
l_list VARCHAR2(32767);
 l_res VARCHAR2(4000);
 BEGIN SELECT listagg(column_name,',') WITHIN GROUP(ORDER BY to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mon'))
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';
   l_list:='with t2 as(
  select God, Kod_sotr,'||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year)'||
  q'~
 select /* God, Kod_sotr, */ listagg(lag_WN) within group (order by RN,Kod_sotr) vacation
  from (
  select rownum RN, God, Kod_sotr,
  case when lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number > 1 then /*Weeks*/Weeks_D||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then            /*Weeks*/Weeks_D||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then  /*Weeks*/Weeks_D||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, /*weeks*/
to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd mon') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(ltrim(weeks,'N')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;



А это больничные

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace FUNCTION get_week_list4(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS
  l_list  VARCHAR2(32767);
  l_res   VARCHAR2(4000);
BEGIN
SELECT listagg('CASE WHEN '||column_name||' IN(''б'') THEN '||''''|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||''''||'||''; '' ELSE NULL END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
RETURN RTRIM(l_res);
END;



Вот вызов, где ищет отпуска одного человека

Код: plsql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr (get_week_list3(10,2017), '[^;]*;') || regexp_substr (get_week_list3(10,2017), ' [^;]*;$')) as Week1, 
(regexp_substr (get_week_list4(10,2017), '[^;]*;') ||  regexp_substr (get_week_list4(10,2017), ' [^;]*;$')) as Week2, 
week_fun2(10,2017) as Week3 FROM GRAFIK t, USERS u  where 10 = u.KOD_SOTR



А вот результат, причём с остальными юзерами всё нормально (на фото).

Объясните, в чём причина?
...
Рейтинг: 0 / 0
27.04.2017, 09:09
    #39445182
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Norman94,

поправка: А вот результат, причём с остальными юзерами тоже самое (на фото).
...
Рейтинг: 0 / 0
27.04.2017, 09:19
    #39445187
Бракованный финский угорь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
авторЕсли допустим я вывожу одного, то он вытаскивает 3 СТРОКИ, причём одинаковых по содержанию. Почему так происходит?

Может у тебя строки где-то размножаются?
...
Рейтинг: 0 / 0
27.04.2017, 09:20
    #39445191
Странности вывода
Norman94,

у тебя запрос (" вызов, где ищет отпуска одного человека"(с)) работает по декартову произведению двух таблиц - GRAFIK t, USERS u, ибо в условиях WHERE ты никак не соединил их между собой. В итоге, строки размножаются и получается то, что получается.
...
Рейтинг: 0 / 0
27.04.2017, 09:20
    #39445192
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Norman94то он вытаскивает 3 СТРОКИ, причём одинаковых по содержанию. Почему так происходит?
на картинке год разный
...
Рейтинг: 0 / 0
27.04.2017, 09:22
    #39445193
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Добрый Э - Эх,

Я изменил на

Код: sql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr (get_week_list3(10,2017), '[^;]*;') || regexp_substr (get_week_list3(10,2017), ' [^;]*;$')) as Week1, 
(regexp_substr (get_week_list4(10,2017), '[^;]*;') ||  regexp_substr (get_week_list4(10,2017), ' [^;]*;$')) as Week2, 
week_fun2(10,2017) as Week3 FROM GRAFIK t, USERS u  where u.kod_sotr = 10 and u.kod_sotr = u.KOD_SOTR



Но ничего не поменялось
...
Рейтинг: 0 / 0
27.04.2017, 09:23
    #39445194
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Norman94,

Хорошо, что все на форуме знают содержимое твоих таблиц! Вот как вспомню 13-ю строку в users, так сразу обязательно подскажу.

Ну и посмотри внимательно на условие соединения этих таблиц. Очень внимательно. Лично я пока что его не нашёл.
...
Рейтинг: 0 / 0
27.04.2017, 09:23
    #39445195
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
123йй,

Потому что у другого пользователя отпуск в 2016 году, у двух остальных - в 2017. У юзера, которого я вытаскиваю, год вообще 2017
...
Рейтинг: 0 / 0
27.04.2017, 09:24
    #39445197
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Norman94Добрый Э - Эх,

Я изменил на

Код: sql
1.
... u.kod_sotr = u.KOD_SOTR




Но ничего не поменялось

Да ты талант
...
Рейтинг: 0 / 0
27.04.2017, 09:26
    #39445200
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
env,

Пардон, забыл
...
Рейтинг: 0 / 0
27.04.2017, 09:26
    #39445202
Norman94
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
env,

Ой, блин, точно))) Всё, исправил, спасибо Вам ещё раз)
...
Рейтинг: 0 / 0
27.04.2017, 09:30
    #39445207
Бракованный финский угорь
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Norman94,

Доброго Э-эха благодари.

Век его помнить будешь! ©Ух ты, говорящая рыба.
...
Рейтинг: 0 / 0
27.04.2017, 09:52
    #39445224
AnSi_Sr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Norman94env,
Пардон, забыл
/*scipped: персональные данные*/

Диман, как погода в Астрахани?
...
Рейтинг: 0 / 0
28.04.2017, 15:54
    #39446228
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности вывода
Norman94Вот вызов, где ищет отпуска одного человека

Код: plsql
1.
2.
3.
SELECT t.god, u.FIO, (regexp_substr (get_week_list3(10,2017), '[^;]*;') || regexp_substr (get_week_list3(10,2017), ' [^;]*;$')) as Week1, 
(regexp_substr (get_week_list4(10,2017), '[^;]*;') ||  regexp_substr (get_week_list4(10,2017), ' [^;]*;$')) as Week2, 
week_fun2(10,2017) as Week3 FROM GRAFIK t, USERS u  where 10 = u.KOD_SOTR



А вот результат, причём с остальными юзерами всё нормально (на фото).

Объясните, в чём причина?
get_week_list3(10,2017) вместо константы имхо get_week_list3(t.kod_sotr,t.god)

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


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