NVL для DOUBLE в UDF (FB 1.0) - невозможно?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Sergey Masloff
Сообщения: 5
Зарегистрирован: 13 апр 2005, 21:00

NVL для DOUBLE в UDF (FB 1.0) - невозможно?

Сообщение Sergey Masloff » 06 дек 2005, 22:31

Похоже, для 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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 06 дек 2005, 23:16

Встречный вопрос - а нафига нулл в нумериках? Не проще ли устроить там default 0 и не париться?

Sergey Masloff
Сообщения: 5
Зарегистрирован: 13 апр 2005, 21:00

Сообщение Sergey Masloff » 07 дек 2005, 08:37

Ну не хотел бы вступать в дискуссию а на фига. Нужно. В общем случае NULL <> 0 да и NVL не всегда к нулю должна приводить.
По существу вопроса есть предложения?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 дек 2005, 09:43

а непонятно, к какому "успеху не привели", поэтому и предложений нет.

Sergey Masloff
Сообщения: 5
Зарегистрирован: 13 апр 2005, 21:00

Сообщение Sergey Masloff » 07 дек 2005, 09:50

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

Sergey Masloff
Сообщения: 5
Зарегистрирован: 13 апр 2005, 21:00

Сообщение Sergey Masloff » 07 дек 2005, 09:55

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 07 дек 2005, 13:03

Серёжа, не буди во мне зверя :lol:

1. Лично мне незнакомы реальные задачи, в которых в нумериках действителньно нужны нуллы. В датах - однозначно да, в строках - сомнительно, в ссылках - тоже вообще-то сомнительно, хоть и стало модно, а вот в цыфИри - не нужны и мешают.

2. Нефиг таскать резалт в форум по кускам. Экспортни в файло и вставь из него целиком, у тебя во второй строке явно не хватает колонок.

3. Чтоб сохранить форматирование, жмакай кнопучку Code наверху в начале и в конце вставки.

4. Как известно, в типе Double Precision чистого равенства чему-либо, в том числе нулю, не может быть по определению. Так что -319 порядки можно смело считать им, родимым.

5. Если ты пихаешь BigInt в параметр UDF типа Double, то чему дальше удивляться? Ну интерпретирует оно его каким-то образом как мантиссу-порядок, ну получает всякие чюдеса.

6. У тебя членский взнос в FF сильно просрочен :wink: Надо бы либо оплатить, либо cancel membership, если твоя ситуация изменилась.

Sergey Masloff
Сообщения: 5
Зарегистрирован: 13 апр 2005, 21:00

Сообщение Sergey Masloff » 07 дек 2005, 14:06

Merlin писал(а):Серёжа, не буди во мне зверя :lol:

>1. Лично мне незнакомы реальные задачи, в которых в нумериках >действителньно нужны нуллы. В датах - однозначно да, в строках - >
Это не значит что их нет. Сразу навскидку - агентский договор. Указать в нем 0 в качестве комиссии - нарушение законодательства а вот NULL как признак отсутствия комиссии - ситуация не то что допустимая а явно требуемая в некоторых случаях. Таких примеров масса. В любом случае хочется NVL с вытекающими - и в select и в where и в теле ХП в выражении написать... ну нужно, честное слово

>2. Нефиг таскать резалт в форум по кускам. Экспортни в файло и >вставь из него целиком, у тебя во второй строке явно не хватает >колонок.
Тут я не прав

>3. Чтоб сохранить форматирование, жмакай кнопучку Code наверху в> начале и в конце вставки.
см. ответ на 2

>4. Как известно, в типе Double Precision чистого равенства чему->либо, в том числе нулю, не может быть по определению. Так что -319 >порядки можно смело считать им, родимым.
это я знаю. Для NUMERIC что делать?

>5. Если ты пихаешь BigInt в параметр UDF типа Double, то чему >дальше удивляться? Ну интерпретирует оно его каким-то образом >как мантиссу-порядок, ну получает всякие чюдеса.
Параметры же PDSC при чем тут Double? Впрочем, у меня уже очень длинный период неработы с IB так что могу стоять на очевидных граблях.

>6. У тебя членский взнос в FF сильно просрочен :wink: Надо бы >либо оплатить, либо cancel membership, если твоя ситуация >изменилась.
Не знаю можно ли это назвать изменением. Просто раньше мне было до офиса ibase 3 минуты пешком а сейчас час транспортом. А в рабочее время возможности отлучаться не имею. Так что если есть реквизиты для перевода на счет то всегда готов а вот ехать - увы :(

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 07 дек 2005, 14:35

Sergey Masloff писал(а): Сразу навскидку - агентский договор. Указать в нем 0 в качестве комиссии - нарушение законодательства а вот NULL как признак отсутствия комиссии - ситуация не то что допустимая а явно требуемая в некоторых случаях.
Я не силён в агентских договорах, но сдаёцца мне, что ты путаешь ситуацию с проституцией (С). Очень любопытно было бы узнать, каким именно образом, в какой статье и какого кодекса, законодательство требует слова NULL в какой-то строке договора :wink: А вот использовать в качестве признака непризнаковый тип, сэкономить на полях и писать в поле Комиссия НЕТУ по нуллу - это твоя воля, но вот сервер, панимаш, при выполнении других операций с полем работает по стандарту, а не по нашей воле.
Sergey Masloff писал(а): Для NUMERIC что делать?
Виш ли, в том углу, в который ты себя загнал своей волей, я тебе помочь ничем не могу - нету у меня давно FB1, третьего диалекта не было отродясь, ну и проблемы нуллоборства мне тоже слабо знакомы, ибо обхожу я их прозорливо-рефлекторно на этапе проектирования.

А квотирование галками - ты как-то умудрился сюда по nntp подключиться что ли?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 07 дек 2005, 14:39

Кстати, e.p.i только что заработал опять, так что спроси там - мож найдёшь собратьев-нуллоборцев :wink:

eg
Сообщения: 17
Зарегистрирован: 09 ноя 2005, 22:33

Сообщение eg » 07 дек 2005, 15:41

Код: Выделить всё

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 дек 2005, 15:50

если не мучиться с пониманием что ж там в результате, то надо просто поглядеть исходник idnvl из fbudf. По крайней мере я знаю, что в некоторых udf, которые by descriptor, некорректно обрабатывается null. Ситуаций с null в by descriptor может быть две. Либо nil в pdsc, либо флаг dsc_null в pdsc.

Ответить