NVL для DOUBLE в UDF (FB 1.0) - невозможно?
-
- Сообщения: 5
- Зарегистрирован: 13 апр 2005, 21:00
NVL для DOUBLE в UDF (FB 1.0) - невозможно?
Похоже, для FB 1.0 не решается или ткните носом. Для TIMESTAMP и строк без проблем а что делать с NUMERIC-ами?
DIALECT 3 FB1.02 попытки использовать idNvl из fbudf а также написания своего аналога к успеху не привели
Пример
create table test_t (id integer, x1 numeric(18,4), x2 numeric(18,4), primary key id);
insert into test_t(id, x1, x2) values (1, 5, 10);
insert into test_t(id, x1, x2) values (2, NULL, 10);
insert into test_t(id, x1, x2) values (3, 5, NULL);
select x1, dnvl(x1,0) as xx1, x2, dnvl(x2,0) as xx2 from test_t
DIALECT 3 FB1.02 попытки использовать idNvl из fbudf а также написания своего аналога к успеху не привели
Пример
create table test_t (id integer, x1 numeric(18,4), x2 numeric(18,4), primary key id);
insert into test_t(id, x1, x2) values (1, 5, 10);
insert into test_t(id, x1, x2) values (2, NULL, 10);
insert into test_t(id, x1, x2) values (3, 5, NULL);
select x1, dnvl(x1,0) as xx1, x2, dnvl(x2,0) as xx2 from test_t
-
- Сообщения: 5
- Зарегистрирован: 13 апр 2005, 21:00
-
- Сообщения: 5
- Зарегистрирован: 13 апр 2005, 21:00
Ну я пример привелkdv писал(а):а непонятно, к какому "успеху не привели", поэтому и предложений нет.

Если в декларации dnvl
DECLARE EXTERNAL FUNCTION DNVL
NUMERIC(18, 4) BY DESCRIPTOR,
NUMERIC(18, 4) BY DESCRIPTOR
RETURNS NUMERIC(18,4) BY DESCRIPTOR
ENTRY_POINT 'idNvl' MODULE_NAME 'fbudf'
заменить NUMERIC на DOUBLE PRECISION то результаты будут другие но все равно неправильные. Возвращает или всегда 0 или какие-то очень большие значения вместо NULL
-
- Сообщения: 5
- Зарегистрирован: 13 апр 2005, 21:00
select x1, dnvl(x1,0) nx1, dnvl2(x1,0) n2x1, x1, dnvl(x2,0) n1x2, dnvl2(x2,0) n2x2 from test_t
дает результат:
dnvl все параметры NUMERIC(18,4)
dnvl2 все параметры DOUBLE PRECISION
X1 NX1 N2X1 X11 N1X2 N2X2
5 5 2.47032822920623E-319 5 10 4.94065645841247E-319
239480933974.016 1.18319302310537E-308 10 4.94065645841247E-319
5 5 2.47032822920623E-319 5 239480933974.016 1.18319302310537E-308
дает результат:
dnvl все параметры NUMERIC(18,4)
dnvl2 все параметры DOUBLE PRECISION
X1 NX1 N2X1 X11 N1X2 N2X2
5 5 2.47032822920623E-319 5 10 4.94065645841247E-319
239480933974.016 1.18319302310537E-308 10 4.94065645841247E-319
5 5 2.47032822920623E-319 5 239480933974.016 1.18319302310537E-308
Серёжа, не буди во мне зверя 
1. Лично мне незнакомы реальные задачи, в которых в нумериках действителньно нужны нуллы. В датах - однозначно да, в строках - сомнительно, в ссылках - тоже вообще-то сомнительно, хоть и стало модно, а вот в цыфИри - не нужны и мешают.
2. Нефиг таскать резалт в форум по кускам. Экспортни в файло и вставь из него целиком, у тебя во второй строке явно не хватает колонок.
3. Чтоб сохранить форматирование, жмакай кнопучку Code наверху в начале и в конце вставки.
4. Как известно, в типе Double Precision чистого равенства чему-либо, в том числе нулю, не может быть по определению. Так что -319 порядки можно смело считать им, родимым.
5. Если ты пихаешь BigInt в параметр UDF типа Double, то чему дальше удивляться? Ну интерпретирует оно его каким-то образом как мантиссу-порядок, ну получает всякие чюдеса.
6. У тебя членский взнос в FF сильно просрочен
Надо бы либо оплатить, либо cancel membership, если твоя ситуация изменилась.

1. Лично мне незнакомы реальные задачи, в которых в нумериках действителньно нужны нуллы. В датах - однозначно да, в строках - сомнительно, в ссылках - тоже вообще-то сомнительно, хоть и стало модно, а вот в цыфИри - не нужны и мешают.
2. Нефиг таскать резалт в форум по кускам. Экспортни в файло и вставь из него целиком, у тебя во второй строке явно не хватает колонок.
3. Чтоб сохранить форматирование, жмакай кнопучку Code наверху в начале и в конце вставки.
4. Как известно, в типе Double Precision чистого равенства чему-либо, в том числе нулю, не может быть по определению. Так что -319 порядки можно смело считать им, родимым.
5. Если ты пихаешь BigInt в параметр UDF типа Double, то чему дальше удивляться? Ну интерпретирует оно его каким-то образом как мантиссу-порядок, ну получает всякие чюдеса.
6. У тебя членский взнос в FF сильно просрочен

-
- Сообщения: 5
- Зарегистрирован: 13 апр 2005, 21:00
Merlin писал(а):Серёжа, не буди во мне зверя![]()
>1. Лично мне незнакомы реальные задачи, в которых в нумериках >действителньно нужны нуллы. В датах - однозначно да, в строках - >
Это не значит что их нет. Сразу навскидку - агентский договор. Указать в нем 0 в качестве комиссии - нарушение законодательства а вот NULL как признак отсутствия комиссии - ситуация не то что допустимая а явно требуемая в некоторых случаях. Таких примеров масса. В любом случае хочется NVL с вытекающими - и в select и в where и в теле ХП в выражении написать... ну нужно, честное слово
>2. Нефиг таскать резалт в форум по кускам. Экспортни в файло и >вставь из него целиком, у тебя во второй строке явно не хватает >колонок.
Тут я не прав
>3. Чтоб сохранить форматирование, жмакай кнопучку Code наверху в> начале и в конце вставки.
см. ответ на 2
>4. Как известно, в типе Double Precision чистого равенства чему->либо, в том числе нулю, не может быть по определению. Так что -319 >порядки можно смело считать им, родимым.
это я знаю. Для NUMERIC что делать?
>5. Если ты пихаешь BigInt в параметр UDF типа Double, то чему >дальше удивляться? Ну интерпретирует оно его каким-то образом >как мантиссу-порядок, ну получает всякие чюдеса.
Параметры же PDSC при чем тут Double? Впрочем, у меня уже очень длинный период неработы с IB так что могу стоять на очевидных граблях.
>6. У тебя членский взнос в FF сильно просрочен

Не знаю можно ли это назвать изменением. Просто раньше мне было до офиса ibase 3 минуты пешком а сейчас час транспортом. А в рабочее время возможности отлучаться не имею. Так что если есть реквизиты для перевода на счет то всегда готов а вот ехать - увы

Я не силён в агентских договорах, но сдаёцца мне, что ты путаешь ситуацию с проституцией (С). Очень любопытно было бы узнать, каким именно образом, в какой статье и какого кодекса, законодательство требует слова NULL в какой-то строке договораSergey Masloff писал(а): Сразу навскидку - агентский договор. Указать в нем 0 в качестве комиссии - нарушение законодательства а вот NULL как признак отсутствия комиссии - ситуация не то что допустимая а явно требуемая в некоторых случаях.

Виш ли, в том углу, в который ты себя загнал своей волей, я тебе помочь ничем не могу - нету у меня давно FB1, третьего диалекта не было отродясь, ну и проблемы нуллоборства мне тоже слабо знакомы, ибо обхожу я их прозорливо-рефлекторно на этапе проектирования.Sergey Masloff писал(а): Для NUMERIC что делать?
А квотирование галками - ты как-то умудрился сюда по nntp подключиться что ли?
Код: Выделить всё
create table test_t (id integer, x1 numeric(18,4), x2 numeric(18,4));
insert into test_t(id, x1, x2) values (1, 5, 10);
insert into test_t(id, x1, x2) values (2, NULL, 10);
insert into test_t(id, x1, x2) values (3, 5, NULL);
Код: Выделить всё
declare external function dnvl
double precision by descriptor, double precision by descriptor
returns double precision by descriptor
entry_point 'idNvl' module_name 'fbudf';
Код: Выделить всё
select
x1,x2,
dnvl(x1,0) dnvl_x1,
dnvl(x2,0) dnvl_x2,
dnvl(cast(x1 as double precision),0) dp_dnvl_nx1,
dnvl(cast(x2 as double precision),0) dp_dnvl_nx2
from test_t