Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / COLLECTION - ERROR (-9634) / 4 сообщений из 4, страница 1 из 1
01.04.2008, 11:58
    #35226758
jax#13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLLECTION - ERROR (-9634)
Есть процедура возвращающая все дни месяца по дате.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROCEDURE kalendar(p_date DATE)
RETURNING DATE;
DEFINE fDate, lDate, v_Rez Date;
DEFINE v_kalendar_Tbl SET (DATE NOT NULL);

SELECT MDY(MONTH(extend(p_date, year to month) -  1  units month),  1 , YEAR(extend(p_date, year to month)-  1  units month)) +  1  UNITS MONTH,
        MDY(MONTH(p_date),  1 , YEAR(p_date)) +  1  UNITS MONTH -  1  UNITS DAY 
        INTO fDate, ldate
 FROM table(set{ 1 });

 WHILE fDate < lDate
      SELECT DATE(MDY(MONTH(fDate), DAY(fDate), YEAR(fDate))) INTO v_kalendar_Tbl
      FROM table(set{ 1 });
      LET fdate= fdate +  1  UNITS DAY;
 END WHILE;  
 
 FOREACH cur FOR SELECT * INTO v_Rez 
                 FROM v_kalendar_Tbl
    RETURN v_Rez WITH RESUME;
 END FOREACH;

END PROCEDURE;

После того как делаем вызов. execute procedure kalendar('28.03.2008')
Процедура по непонятным причинам материться следующим образом:
ERROR (-9634): NO CAST FROM DATE TO SET (DATE NOT NULL)

В этом собственно и весь вопрос.
...
Рейтинг: 0 / 0
01.04.2008, 15:14
    #35227527
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLLECTION - ERROR (-9634)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
drop procedure kalendar;
CREATE PROCEDURE kalendar(p_date DATE)
RETURNING DATE;
  DEFINE fDate, lDate, v_Rez Date;
  DEFINE v_kalendar_Tbl set(date NOT NULL);

  let fDate = extend(p_date, year to month);
  let ldate = MDY(MONTH(p_date),  1 , YEAR(p_date)) +  1  UNITS MONTH -  1  UNITS DAY;

  WHILE fDate <= lDate
    insert into TABLE(v_kalendar_Tbl) VALUES (fDate); 
    LET fdate= fdate +  1  UNITS DAY;
  END WHILE;  

 FOREACH cur FOR SELECT * INTO v_Rez 
                 FROM table(v_kalendar_Tbl)
    RETURN v_Rez WITH RESUME;
 END FOREACH;

END PROCEDURE;

execute procedure kalendar('18.02.2008')

01.02.08
02.02.08
03.02.08
04.02.08
05.02.08
06.02.08
07.02.08
08.02.08
09.02.08
10.02.08
11.02.08
12.02.08
13.02.08
14.02.08
15.02.08
16.02.08
17.02.08
18.02.08
19.02.08
20.02.08
21.02.08
22.02.08
23.02.08
24.02.08
25.02.08
26.02.08
27.02.08
28.02.08
29.02.08


Изврат, никогда никогда так не делайте.
делайте табличку

adate date
day int
mon int
year int
№квартала int
№недели int
заполняйте на 100 следующих лет, индексируете по всякому и живите щаслифа.
...
Рейтинг: 0 / 0
01.04.2008, 17:22
    #35227986
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLLECTION - ERROR (-9634)
Заполнять табличку на 100 лет, имхо, тоже изврат. Надо функции писать дата -> номер недели (месяца, квартала) и обратно.

Вот еще одно решение одним запросом:
Код: plaintext
1.
2.
3.
  
select mdy(month(today), unnamed_col_1, year(today)) date
    from table(multiset{ 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 }) d
    where unnamed_col_1 <= date(today + 1  units month) - date(today)
...
Рейтинг: 0 / 0
01.04.2008, 17:26
    #35228005
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
COLLECTION - ERROR (-9634)
ak-47Заполнять табличку на 100 лет, имхо, тоже изврат.Есть сущность -- время, почему бы ей не иметь свою табличку в бд? Оптимизатор он же дебил с большой буквы И, зачем его путать лишними процедурами?
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / COLLECTION - ERROR (-9634) / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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