powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование значений в дату
65 сообщений из 65, показаны все 3 страниц
Преобразование значений в дату
    #39422847
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Имеется огромная таблица График с кодом сотрудника, годом и 52 столбцами N1, N2 и т.д., характеризующими недели. В значениях этих недель находятся символьные значения о, у, которые обозначают вид отпуска.

У меня есть функция, которая динамически проходит по столбцам и вытаскивает только те, в которых есть обозначение о, причём именно интервалами, то есть первую неделю интервала и последнюю.

На выходе функция выдаёт (N1, N5; N10, N11), но мне нужно, чтобы выводилось как (01.01, 28.01), то есть выдавал число и месяц начала недели заместо N.

Я пытался вставить этот момент в готовую функцию

Оригинальная функция выглядит так:

Код: 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.
create or replace FUNCTION
 week_fun1(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 1)
 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||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then Weeks||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, weeks, 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.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
create or replace FUNCTION
 week_fun1(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_number(LTRIM(column_name,'N')))
 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||';'
      when lead(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||';'
       when lag(Week_Number) over(PARTITION by God order by Kod_sotr) is null then Weeks||','
       when Week_number - lag(Week_Number) over(PARTITION by God order by Kod_sotr) > 1 then Weeks||','
       else null end lag_WN
          from (
                   select God, Kod_sotr, weeks, Vacation, cast(to_char( trunc (to_date(~'||i_year||q'~||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(to_char( trunc (to_date(~'||i_year||q'~||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number)
                )
          )group by god, Kod_sotr~';
   EXECUTE IMMEDIATE l_list INTO l_res USING i_code,i_year;
  RETURN RTRIM(l_res);
  END;



Но при вызове
Код: plsql
1.
  select week_fun( kod_sotr,god) f from grafik g;


Он выдаёт "неверный номер", и я вообще не понимаю что это значит. Прошу, помогите понять, в чём дело?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422855
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Прошу, помогите понять, в чём дело?Не надо создавать тыщи тем.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422856
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"неверный номер"

У ошибки есть код и стандартный текст, по которому можно сразу нагуглить информацию.
Запрос выньте из execute immediate, отлаживайте в отдельном SQL-окне.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422859
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Эта тема отличается от той. Но больше не буду.
dmdmdm"неверный номер"

У ошибки есть код и стандартный текст, по которому можно сразу нагуглить информацию.
Запрос выньте из execute immediate, отлаживайте в отдельном SQL-окне.
Бесполезно, он пишет, типа Указан недопустимый номер, но это странно, учитывая, что я просто пытаюсь преобразовать численные значения N в дату. В других похожих функциях всё работало.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422952
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Бесполезно

Если нет test case, действительно, разговаривать бесполезно.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422956
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdmNorman94Бесполезно

Если нет test case, действительно, разговаривать бесполезно.

У меня проверок было полно, но что бы я ни делал, у меня не получалось подставлять эту функцию to_char( trunc (to_date(i_year||'0101', 'yyyymmdd')
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mm') для того, чтоб преобразовать порядковый номер столбца в дату.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422957
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
cast (to_char(..., 'dd.mm') as number)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422960
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AnSi_Sr
Код: plsql
1.
cast (to_char(..., 'dd.mm') as number)



Пытался

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
from (
                   select God, Kod_sotr, weeks, Vacation, cast(to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd.mm')as number)
                )where vacation='о'
          )group by god, Kod_sotr~';



Пишет invalid number
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422961
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Пишет invalid numberОн ошибается. Ты не number.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422964
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicNorman94Пишет invalid numberОн ошибается. Ты не number.
Грубые вы. Я у вас помощи попросил, а вы начинаете оскорблениями кидаться.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422967
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422972
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)



Здорово, теперь он мало того, что он не преобразил ничего, так и абракадабру начал выдавать
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422974
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййNorman94Пытался
говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422976
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_Sr,

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

говнокодить так по полной
Код: plsql
1.
cast (to_char(..., 'dd,mm') as number)




Так же

Код: sql
1.
2.
select God, Kod_sotr, weeks, Vacation, cast(to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(weeks,'N'))-1)*7, 'ww'), 'dd,mm')as number) Week_Number from t2
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422981
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94так и абракадабру начал выдавать
за то нет ошибки :)Norman94Пишет invalid number
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39422982
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123ййNorman94так и абракадабру начал выдавать
за то нет ошибки :)Norman94Пишет invalid number

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

Код: sql
1.
2.
3.
4.
5.
BEGIN SELECT listagg(to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mm'),',') WITHIN GROUP(ORDER BY 1)
 INTO l_list
 FROM user_tab_columns
 WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%';


При этом снизу я убрал те моменты, где происходило отсеивание столбцов цифр от N

То есть как было:

Код: sql
1.
2.
3.
4.
5.
6.
from (
                   select God, Kod_sotr, weeks, 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~';



И как стало

Код: sql
1.
2.
3.
4.
5.
6.
from (
                   select God, Kod_sotr, weeks, Vacation, cast(weeks as number) Week_Number from t2
                  unpivot (vacation for weeks in (~'||l_list||q'~))
                 order by God, Kod_sotr, cast(weeks as number)
                )where vacation='о'
          )group by god, Kod_sotr~';



Теперь же на этот раз он пишет, что неверный идентификатор, хотя я уже не представляю что ему вообще надо. Никак не получается преобразовать N01 в 1 января (01.01)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423143
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывод идёт отсюда с этой строчки
Код: sql
1.
2.
 select /* God, Kod_sotr, */ listagg(ltrim(lag_WN, 'N')) within group (order by RN,Kod_sotr) vacation
  from (



То есть теперь ответ получается без N, что радует. Однако попытавшись туда вставить проклятую формулу для подсчёта даты, он снова пишет invalid number. Помогите пожалуйста разобраться, где я ошибаюсь?

to_char( trunc (to_date(i_year||'0101', 'yyyymmdd')
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mm')

Вот формула
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423163
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О сколько нам открытий чудных готовит неявных преобразований типов дух...
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423166
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

То есть? Я вывожу строку, я и компилирую как строку. И в рассчёте идёт преобразование в строку)
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423175
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94То есть? Я вывожу строку, я и компилирую как строку. И в рассчёте идёт преобразование в строку)
аNorman94он снова пишет invalid number
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423178
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,

Блин я запутался(
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423183
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййNorman94он снова пишет invalid number
я так понял, теперь он уже пишет "invalid identifier"
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423190
Norman94env,

То есть? Я вывожу строку, я и компилирую как строку. И в рассчёте идёт преобразование в строку)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
  2  + ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual;
CAST(TO_CHAR(TRUNC(TO_DATE(201
------------------------------
                         30.12
SQL> alter session ...
Session altered
SQL> select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
  2  + ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual;
select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
+ ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual

ORA-01722: invalid number


SQL> alter session ...
Session altered
SQL> select cast(to_char( trunc (to_date(2016||'0101', 'yyyymmdd')
  2  + ((LTRIM('N53','N'))-1)*7, 'ww'), 'dd.mm')as number) from dual;
CAST(TO_CHAR(TRUNC(TO_DATE(201
------------------------------
                         30.12
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423195
Norman94,

Код: sql
1.
lead(Week_Number) over(PARTITION by God order by Kod_sotr) - Week_number 


и
Код: sql
1.
cast(to_char( ... 'dd.mm')as number) Week_Number 



в этом смысле что больше
23.04 или 24.03 ?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423202
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Преобразователь,

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

24.03

Да, невнимательный я.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423219
Norman94Имеется огромная таблица График с кодом сотрудника, годом и 52 столбцами N1, N2 и т.д., характеризующими недели.

Format Models
авторWW

Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423710
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня небольшой вопрос на будущее, вдруг в дальнейшем пригодится. Вот у меня сейчас выходит число и месяц цифрами, а как можно будет сделать так, чтобы число месяца поменять на буквенное значение, например 01 января.

Вот здесь преобразовать

Код: sql
1.
2.
3.
4.
rom (
                   select God, Kod_sotr, /*weeks*/
to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd.mm') Weeks_D, 
                   Vacation, cast(ltrim(weeks,'N')as number) Week_Number from t2


dd.mm на dd.month как я читал не получилось - функция тут же выдаёт ошибку, и говорит что неверное число. Подскажите, как можно будет поменять на буквенное значение?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423713
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть в этой функции я подставил вместо mm - mon, и он пишет "missing keyword". Подскажите, что не так?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace FUNCTION get_week_list_prob(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;
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423722
Norman94dd.mm на dd.month как я читал не получилось - функция тут же выдаёт ошибку, и говорит что неверное число.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> select to_char(trunc(to_date(2017,'yyyy'),'y')+(cast(ltrim('N11','N') as number)-1)*7,'dd.mm') from dual;
TO_CHAR(TRUNC(TO_DATE(2017,'YY
------------------------------
12.03

SQL> select to_char(trunc(to_date(2017,'yyyy'),'y')+(cast(ltrim('N11','N') as number)-1)*7,'dd.month') from dual;
TO_CHAR(TRUNC(TO_DATE(2017,'YY
-----------------------------------
12.март



где ошибка ?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423726
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94и он пишет "missing keyword "И опять он не про то…
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423731
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Преобразователь,

Вот, прикол в том, что здесь он выдает всё как надо, а вот внутри функции на этой строке

Код: sql
1.
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;


Уже выпадает ошибка, и он пишет missing keyword
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423760
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

то есть?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423775
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94то есть? brains
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423779
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Ну а если без шуток, в чём может быть проблема? Ведь при обычном селекте всё проходит, а в функции он начинает старадать хернёй.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423787
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Преобразователь,

Вот, прикол в том, что здесь он выдает всё как надо, а вот внутри функции на этой строке

Код: sql
1.
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;


Уже выпадает ошибка, и он пишет missing keyword

Код: plsql
1.
dbms_output.println('SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year')
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423788
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
Код: plsql
1.
println



Допустим, а как в таком случае он мне вернёт значение по заданным ему аргументам?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423793
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как бы это смешное не звучало, но при таком раскладе он мне выдает, что функция возвращается без аргументов

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create or replace FUNCTION get_week_list_prob(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%';
  dbms_output.enable;
  dbms_output.put_line('SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year') ;
--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;

SELECT t.god, u.FIO, (regexp_substr (get_week_list_prob(t.kod_sotr,t.god), '^([[:digit:]]+)(,)([[:digit:]]+)(;)') || 
regexp_substr (get_week_list_prob(t.kod_sotr,t.god), '([[:digit:]]+)(,)([[:digit:]]+)(;)$')) as за_свой_счёт FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423800
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заметил ещё одну странность, не знаю имеет ли это роли, но если допустим задаётся 'dd.mm', то в выходной строке получается (01,01). То есть, всё таки наверное дело в EXECUTE IMMEDIATE?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423801
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Код: plsql
1.
println



put_line разумеется


Norman94функция возвращается без аргументов
Код: plsql
1.
--RETURN RTRIM(l_res);


С чего бы это она....

Сударь, неужели надо настолько разжевывать примитивные вещи? Самообучение - слышали такое слово?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423805
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envenv
Код: plsql
1.
println




put_line разумеется


Norman94функция возвращается без аргументов
Код: plsql
1.
--RETURN RTRIM(l_res);



С чего бы это она....

Сударь, неужели надо настолько разжевывать примитивные вещи? Самообучение - слышали такое слово?

Нет, я понимаю, что раз мы их не указываем, то и соответственно "до свидания", но тем не менее я всегда работал с EXECUTE, а если касался put_line, то никогда не указывал ему доп.аргументов. Чего и спрашиваю у вас как это сделать? Толковых примеров я не нашёл.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423812
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Сударь, прочитайте хоть какой-то учебник по основам программирования. Любой.
У вас явно не хватает систематизированных знаний по предмету как таковому.

Какой тип данных возвращает ваша функция? Что передаётся в execute immediate и put_line?
Уже задав себе самому эти примитивнейшие вопросы можно придумать пяток путей отладки своего кода.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423815
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, я поковырялся с put_line и получилось это

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create or replace FUNCTION get_week_list_prob(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,'yyyy'),'y')+((LTRIM(column_name, 'N'))-1)*7,'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%';
 dbms_output.enable;
dbms_output.put_line('SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=' ||i_code||' AND god=' ||i_year);
l_res:=('SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=' ||i_code||' AND god=' ||i_year);
return l_res;
---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;

SELECT t.god, u.FIO, (regexp_substr (get_week_list_prob(t.kod_sotr,t.god), '^([[:digit:]]+)(,)([[:digit:]]+)(;)') || 
regexp_substr (get_week_list_prob(t.kod_sotr,t.god), '([[:digit:]]+)(,)([[:digit:]]+)(;)$')) as за_свой_счёт FROM GRAFIK t, USERS u 
where t.KOD_SOTR = u.KOD_SOTR;



Теперь же где дата он мне возвращает пустое значение заместо даты.

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

Сударь, прочитайте хоть какой-то учебник по основам программирования. Любой.
У вас явно не хватает систематизированных знаний по предмету как таковому.

Какой тип данных возвращает ваша функция? Что передаётся в execute immediate и put_line?
Уже задав себе самому эти примитивнейшие вопросы можно придумать пяток путей отладки своего кода.

Я уже хз сколько отдалок придумывал, всё безтолку. Я у вас просто прошу помочь понять, почему он напрочь не хочет возвращать тип 'dd.mon', а 'dd.mm' спокойно возвращает. Вот и всё. Какая то нелогичная ошибка, учитывая, что я возвращаю ему строку.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423834
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Для начала, просто сделайте
Код: plsql
1.
select get_week_list_prob(0,0) s from dual

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

Для начала, просто сделайте
Код: plsql
1.
select get_week_list_prob(0,0) s from dual


и помедитируйте на результат.

Получилось это

Код: sql
1.
SELECT CASE WHEN N01 IN('б') THEN 01.янв||'; ' ELSE NULL END ||CASE WHEN N02 IN('б') THEN 08.янв||'; ' ELSE NULL END |



То есть при таком раскладе всё работает
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423841
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нет, вру, он вообще выдаёт черти что. Получается, вариант с out_put не работает(
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423845
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Код: plsql
1.
THEN 01.янв||



Подчеркнуть? Жирным выделить? Помахать флажками и дать гудок? Что надо сделать, чтобы вам это бросилось в глаза?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423850
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envNorman94,

Код: plsql
1.
THEN 01.янв||




Подчеркнуть? Жирным выделить? Помахать флажками и дать гудок? Что надо сделать, чтобы вам это бросилось в глаза?

Я эту строчку уже 100 раз видел, говорю же, вне функции этот подход работает, а внутри EXECUTE выдаёт missing keyword. Поэтому и называю это нелогичной ошибкой.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423854
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94Я уже хз сколько отдалок придумывал, всё безтолку. Я у вас просто прошу помочь понять, почему он напрочь не хочет возвращать тип 'dd.mon', а 'dd.mm' спокойно возвращает. Вот и всё. Какая то нелогичная ошибка, учитывая, что я возвращаю ему строку.

Ты все не уймешься, вроде закончил вчера по этой теме, но похоже не до конца =)
Ты пишешь у меня такая ошибка ... но не пишешь с какого селекта.
Когда показывают что селект должен работать, ты говоришь нет, потому что у меня внутри чтот не то.
Вышли хоть раз тот селект который получился после функции, и который выдает ошибки, т.к. у тебя свои таблицы и я например не вижу что вернет твоя функция. Если внутри нее селект валится, выведи его и запусти/напиши отдельно.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423860
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quote MaximaXXL]
Ты все не уймешься, вроде закончил вчера по этой теме, но похоже не до конца =)
Ты пишешь у меня такая ошибка ... но не пишешь с какого селекта.
Код: sql
1.
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;


Когда показывают что селект должен работать, ты говоришь нет, потому что у меня внутри чтот не то.
Работает первый селект
SELECT listagg('CASE WHEN '||column_name||' IN(''б'') THEN '|| to_char(trunc(to_date(i_year,'yyyy'),'y')+((LTRIM(column_name, 'N'))-1)*7,'dd mon')||'||''; '' ELSE NULL END ' ,'||')
То есть здесь всё замечательно. Отдельно вывожу это - всё преобразовывает. Но в функции он уже начинает ругаться на строчку выше.
MaximaXXLВышли хоть раз тот селект который получился после функции, и который выдает ошибки, т.к. у тебя свои таблицы и я например не вижу что вернет твоя функция. Если внутри нее селект валится, выведи его и запусти/напиши отдельно.

Уже выводили с юзером env выше, и отдельно он работал. А внутри функции пишет ошибку. Сама функция выглядит так.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or replace FUNCTION get_week_list_prob(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,'yyyy'),'y')+((LTRIM(column_name, 'N'))-1)*7,'dd mm')||'||''; '' ELSE NULL END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  INTO  l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
 --dbms_output.enable;
--dbms_output.put_line('SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:' ||i_code||' AND god=:' ||i_year);
--l_res:=('SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:' ||i_code||' AND god=:' ||i_year);
--return l_res;
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;
return l_res;
END;



Вывести должен выбранные мною недели, но в виде дат (то есть название недели - это число начала недели). С 01.01 он работает, а когда пытаюсь его заставить написать мне буквенное обозначение месяца - пишет missing keyword.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423870
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Norman94]MaximaXXLТы все не уймешься, вроде закончил вчера по этой теме, но похоже не до конца =)
Ты пишешь у меня такая ошибка ... но не пишешь с какого селекта.
Код: sql
1.
EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year;


Когда показывают что селект должен работать, ты говоришь нет, потому что у меня внутри чтот не то.
Работает первый селект
SELECT listagg('CASE WHEN '||column_name||' IN(''б'') THEN '|| to_char(trunc(to_date(i_year,'yyyy'),'y')+((LTRIM(column_name, 'N'))-1)*7,'dd mon')||'||''; '' ELSE NULL END ' ,'||')
То есть здесь всё замечательно. Отдельно вывожу это - всё преобразовывает. Но в функции он уже начинает ругаться на строчку выше.
пропущено...


Уже выводили с юзером env выше, и отдельно он работал. А внутри функции пишет ошибку. Сама функция выглядит так.
.....

Вывести должен выбранные мною недели, но в виде дат (то есть название недели - это число начала недели). С 01.01 он работает, а когда пытаюсь его заставить написать мне буквенное обозначение месяца - пишет missing keyword.

Вот тут я заплакал, это точно Вы писали?
Код: plsql
1.
regexp_substr (get_week_list_prob(t.kod_sotr,t.god), '([[:digit:]]+)(,)([[:digit:]]+)(;)$'))


И можете объяснить формат регулярки
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423875
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXLВот тут я заплакал, это точно Вы писали?
Код: plsql
1.
regexp_substr (get_week_list_prob(t.kod_sotr,t.god), '([[:digit:]]+)(,)([[:digit:]]+)(;)$'))



И можете объяснить формат регулярки

Эта формула нужна для того, чтоб выводить первое и последнее значение. И дело далеко не в ней, потому что выводил без неё - без толку.

Код: sql
1.
select get_week_list_prob(109909,2017) s from dual
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423876
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

Для альтернативно одарённых:

dd.mm
Код: plsql
1.
select case 1 when 1 then 01.01||';' else '!' end from dual;



dd.mon
Код: plsql
1.
select case 1 when 1 then 01.янв||';' else '?' end from dual;
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423877
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

И для излишне альтернативно одарённых:
Код: plsql
1.
select case 1 when 1 then '01.янв'||';' else '?' end from dual;
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423885
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Ничего не изменилось.

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT listagg('CASE WHEN '||column_name||' IN(''б'') THEN '|| to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd mon')||'||''; '' ELSE ''?'' END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
into l_list
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';



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

И для излишне альтернативно одарённых:
Код: plsql
1.
select case 1 when 1 then '01.янв'||';' else '?' end from dual;



Уловил суть. Я правильно расставил кавычки?

Код: sql
1.
2.
3.
4.
5.
6.
SELECT listagg('CASE WHEN '||column_name||' IN(''б'') THEN '||q'~ to_char( trunc (to_date(2017||'0101', 'yyyymmdd') 
+ ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mon')~'||'||''; '' ELSE ''?'' END ' ,'||') 
WITHIN GROUP(ORDER BY 1)
  FROM  user_tab_columns
  WHERE TABLE_NAME = 'GRAFIK' 
  AND column_name LIKE 'N%';
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423901
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envNorman94,

И для излишне альтернативно одарённых:
Код: plsql
1.
select case 1 when 1 then '01.янв'||';' else '?' end from dual;



Всё, исправил. Спасибо вам, Сударь!

А теперь объясните пожалуйста, почему пришлось ставить кавычки, я же указал ему to_char?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423912
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

потому что
Код: plsql
1.
select to_char(11.11) from dual


и
Код: plsql
1.
select to_char(11.янв) from dual



работают по разному, в 1 случае это число а во втором хз что
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423937
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Спасибо
Кстати вы правильно подметили ту формулу. Теперь когда я её использую он выдаёт null. В чём дело? Формат не тот?
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423967
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Вот попробовал

Код: sql
1.
select regexp_substr (get_week_list3 (109909, 2017), '[^;]*;')||regexp_substr (get_week_list3 (109909, 2017), '; [&;]*; ') t from dual;



Вроде бы я ему указал первое значение, но затем он выдаёт последующее. Символ & указывает на последнюю запись, но здесь она почему то не работает.
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39423980
Norman94
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё, исправил, спасибо всем большое!
...
Рейтинг: 0 / 0
Преобразование значений в дату
    #39424010
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Norman94,

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


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