powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странности вывода
14 сообщений из 14, страница 1 из 1
Странности вывода
    #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
Странности вывода
    #39445182
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Norman94,

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

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

у тебя запрос (" вызов, где ищет отпуска одного человека"(с)) работает по декартову произведению двух таблиц - GRAFIK t, USERS u, ибо в условиях WHERE ты никак не соединил их между собой. В итоге, строки размножаются и получается то, что получается.
...
Рейтинг: 0 / 0
Странности вывода
    #39445192
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94то он вытаскивает 3 СТРОКИ, причём одинаковых по содержанию. Почему так происходит?
на картинке год разный
...
Рейтинг: 0 / 0
Странности вывода
    #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
Странности вывода
    #39445194
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

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

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

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

Я изменил на

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




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

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

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

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

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

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

Диман, как погода в Астрахани?
...
Рейтинг: 0 / 0
Странности вывода
    #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
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странности вывода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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