Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Странности с подстановкой переменных в SPL / 6 сообщений из 6, страница 1 из 1
18.09.2013, 10:38
    #38399733
rjhdby
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с подстановкой переменных в SPL
Столкнулся со странной проблемой.
Есть процедура, содержащая такие строки

Код: plsql
1.
2.
3.
4.
5.
6.
DEFINE f_session_date    DATETIME YEAR to SECOND;
select current into f_session_date from dummy; --dummy - таблица с одной записью

CREATE TEMP TABLE rpt_juv_temp (session_date DATETIME YEAR to SECOND, sf_code CHAR(2));
insert into rpt_juv_temp
      select f_session_date, a.sf_code from project a;


На версии 9.40.FC7 работает на ура, а вот на версии 11.70.FC4 выдает синтаксическую ошибку.
Региональные настройки идентичны.

Побеждается насильственным приведением переменной к классу datetime внутри SELECT.
Код: plsql
1.
select extend(f_session_date,year to second), a.sf_code from project a;



В чем может быть засада?
...
Рейтинг: 0 / 0
18.09.2013, 22:08
    #38400844
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с подстановкой переменных в SPL
Проверил :

IBM Informix Dynamic Server Version 11.70.FC7

create procedure t1 ()
DEFINE f_session_date DATETIME YEAR to SECOND;
select current into f_session_date from systables where tabid = 100;

CREATE TEMP TABLE rpt_juv_temp (session_date DATETIME YEAR to SECOND, sf_code CHAR(2));
insert into rpt_juv_temp
select f_session_date, 'AA' from systables where tabid = 100;
end procedure

Routine created.


call t1();

Routine executed.
-------------

Короче, был баг, его исправили.
...
Рейтинг: 0 / 0
20.09.2013, 08:39
    #38402317
Kozhina Lidia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с подстановкой переменных в SPL
Добрый день.

скажите, пожалуйста, похожая ситуация.
есть проект на 9.40
в перспективе переход на 11.50
большое количество процедур использует конструкцию без явного приведения типа,
быть может возможно без внесения изменений в тексты обойтись. возможно это тоже баг и уже исправленный:)

CREATE TABLE test(
evening_time DATETIME HOUR to MINUTE);
insert into test (evening_time) values (current);

SELECT DBINFO("version", "full") , TRIM(NVL(dt.evening_time, TO_DATE('00:00', '%H:%M')) || ''),
TRIM(NVL(dt.evening_time, TO_DATE('00:00', '%H:%M') || '')),
TRIM(NVL(dt.evening_time, EXTEND('00:00', HOUR TO MINUTE)) || '')
FROM test dt;

(constant) (expression) (expression)_1 (expression)_2
IBM Informix Dynamic Server Version 11.50.FC9 2013-09-20 08:24:00.00000 08:24 08:24

(constant) (expression) (expression)_1 (expression)_2
IBM Informix Dynamic Server Version 9.40.FC3 08:25 08:25 08:25

-- Эта выборка на 9.41 возвращает часы, а на 11.50  дату с часами,
-- в связи с этим не работают процедуры  на 11.50.

Спасибо, Кожина Л.
...
Рейтинг: 0 / 0
20.09.2013, 17:02
    #38403042
Leonid Belov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с подстановкой переменных в SPL
Kozhina Lidia,

В версии 11.70 FC7:

(constant) IBM Informix Dynamic Server Version 11.70.FC7
(expression) 2013-09-20 16:47:00.00000
(expression) 16:47
(expression) 16:47

так что это не исправлено (вероятно, считают, что незачем)

Похоже, все дело в использовании обертки NVL, что приводит к преобразованию типа.

Первый вызов NVL - с параметрами (DATETIME HOUR TO MINUTE, DATETIME) возвращает DATETIME.
Вероятно, на этапе трансляции запроса строка формата не разбирается, поэтому тип результата
TO_DATE точно не известен и берется по максимуму.

Второй вызов NVL - с параметрами (DATETIME HOUR TO MINUTE, DATETIME || CHAR)
преобразуется в (DATETIME HOUR TO MINUTE, CHAR). Что возвращает - DATETIME HOUR TO MINUTE или строку -
не знаю. Впрочем, в нашем случае это все равно

В третьем NVL используется EXTEND, которая не является функцией в строгом смысле слова - это просто конструкция языка.
Так что NVL вызывается с параметрами (DATETIME HOUR TO MINUTE, DATETIME HOUR TO MINUTE)

Кстати, к слову: не используйте NVL там, где это не нужно.
...
Рейтинг: 0 / 0
25.09.2013, 10:53
    #38406919
Kozhina Lidia
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с подстановкой переменных в SPL
Leonid Belov,
Леонид, благодарю, рада Вас слышать.
Кожина.
...
Рейтинг: 0 / 0
29.09.2013, 21:04
    #38411218
GVF112GVF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странности с подстановкой переменных в SPL
rjhdbyСтолкнулся со странной проблемой.
Есть процедура, содержащая такие строки

Код: plsql
1.
2.
3.
4.
5.
6.
DEFINE f_session_date    DATETIME YEAR to SECOND;
select current into f_session_date from dummy; --dummy - таблица с одной записью

CREATE TEMP TABLE rpt_juv_temp (session_date DATETIME YEAR to SECOND, sf_code CHAR(2));
insert into rpt_juv_temp
      select f_session_date, a.sf_code from project a;


На версии 9.40.FC7 работает на ура, а вот на версии 11.70.FC4 выдает синтаксическую ошибку.
Региональные настройки идентичны.

Побеждается насильственным приведением переменной к классу datetime внутри SELECT.
Код: plsql
1.
select extend(f_session_date,year to second), a.sf_code from project a;




Засада может быть в том, что в версии IDS 11.x и выше, более жесткая процедура проверки типов и нет неявного преобразования типов как это было раньше в более старых версиях. Насколько Я помню, все началось с появлением технологии Datablade в сервере Informix.

PS: Нужно применять явное преобразование типов данных ... :)

С уважением,
Вадим.

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


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