Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизNumber Oracle и числа в "православной". Не хватает Cardinal`a Найти похожие ветки
← →
AV © (2012-11-13 16:07) [0]Давно хотел спросить.
Есть в Oracle тип number. Есть последовательность (sequence)
Юзается часто
Сейчас там значения гораздо больше Cardinal 0..4294967295
Стала одно поделка вылетать.
Там ID нужен, как переменная, по которой идет поиск после.
where
ID_PK(number) = :ID_PK
и параметром переменная, как число
Исправить нужно было срочно, сделал, как string.
Oracle умный, он преобразует "на лету", все работает.
А как правильно надо сделать?
(Если без компонент сторонних)
← →
Медвежонок Пятачок © (2012-11-13 16:18) [1]Юзать дабл на клиенте.
← →
Медвежонок Пятачок © (2012-11-13 16:19) [2]Причем не только в этом случае.
← →
AV © (2012-11-13 16:21) [3]имеешь ввиду, что бы размерность была 8 байт?
← →
Медвежонок Пятачок © (2012-11-13 16:25) [4]Имею ввиду ParamByName().AsFloat везде где в оракле number(n,0)
← →
Игорь Шевченко © (2012-11-13 16:35) [5]
> А как правильно надо сделать?
Объяснить, зачем оно тебе
← →
AV © (2012-11-13 16:49) [6]Простая задача - раскидать услуги по группам услуг
Слева таблица Группы услуг,
правее Услуги, привязанные к группе,
еще правее, кнопки ( Добавить к группе / Исключить из групы)
совсем справа - ничейные услуги
Пользователь хочет добавить услугу к группе
OnКлик кнопки Добавить к группе
var
tmp_G, tmp_S: Double;
begin
tmp_G := sqGroup.FieldByName("ID_GROUP").AsFloat ;
tmp_S := sqServices.FieldByName("ID_SVC").AsFloat ;
AddServiceToGroup(tmp_G, tmp_S);
procedureAddServiceToGroup(const ID_GROUP,ID_SERVICE: Double);
begin
oqAddServiceToGroup.ParamByName("ID_GROUP").Value := ID_GROUP;
oqAddServiceToGroup.ParamByName("ID_SERVICES").Value := ID_SERVICE;
oqAddServiceToGroup.ExecSQL;
oqAddServiceToGroup.Session.Commit;
переправил на Doble и AsFloat
"1,00000000000001E19" is not a valid Oracle Number value.
← →
AV © (2012-11-13 16:54) [7]получается так, - "1,00000000000001E19" это id непривязанной услуги,
Также запрос переправил
Select
SR.SVC_ID ID_SVC, SR.COD ||":"||SR.NAME SVC_NAME
from
main.T_Svc_REF SR
left join GPH_GROUP_SERVICES GS on GS.ID_SERVICES = SR.SVC_ID
where
GS.ID_GS is null
а было (это когда string использовал)
Select
to_char(SR.SVC_ID) ID_SVC, SR.COD ||":"||SR.NAME SVC_NAME
from
main.T_Svc_REF SR
left join applic.GPH_GROUP_SERVICES GS on GS.ID_SERVICES = SR.SVC_ID
where
GS.ID_GS is null
← →
AV © (2012-11-13 17:03) [8]
> oqAddServiceToGroup.ParamByName("ID_GROUP").Value := ID_GROUP;
>
> oqAddServiceToGroup.ParamByName("ID_SERVICES").Value :=
> ID_SERVICE;
asFloat и тут переписал - ничего не происходит
procedureAddServiceToGroup(const ID_GROUP,ID_SERVICE: Double);
ID_GROUP = 1
ID_SERVICE = 1e19
, а такой услуги нет. Реальный id = 10000000000000116380
← →
Игорь Шевченко © (2012-11-13 17:07) [9]напридумывают себе ID-ов, потом мучаются
← →
MonoLife © (2012-11-13 17:19) [10]
> напридумывают себе ID-ов, потом мучаются
вот такие мы ID-оты:)
← →
AV © (2012-11-13 17:20) [11]похоже, это не "перевалило", а сиквенс переделали
и похоже, репликацию готовят так..
Ладно, вернусь к строкам :)
← →
Пит (2012-11-13 17:23) [12]че то автор жжот.
Вообще в дельфи есть куча типов данных, которые могут хранить целые числа выше границ Cardinal. Можно легко посмотреть в справке же.
Например: Int64.
А также double, extended. Тут, правда, автора ждут сюрпризы наверняка. Так что лучше сразу заранее прочитать много букв: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
А вот как эти типы данных передать / считать в оракл, этот вопрос сильно зависит от используемого провайдера данных.
Вот наш любимый Медведь из [1] видимо привык к ADO ))
← →
Медвежонок Пятачок © (2012-11-13 17:26) [13]Скажи, а причем здесь 1e19 и дабл?
Принцип то простой:
лежит на сервере очень длинное число.
читаем его в клиенте AsFloat
передаем обратно в Оракл AsFloat
и никаких 1e19
← →
AV © (2012-11-13 17:30) [14]Юзаю ODAC 6._С_Копейками
с ADO не пробовал, попробую.
А то "некошерно" стрингами светить :)
кстати,
var
a: Int64;
begin
a := 10000000000000116380;
[Error] uOptions.pas(78): Integer constant too large
← →
Аббат Пиккола (2012-11-13 17:32) [15]Я посчитал бы string хорошим решением, если cardinal так быстро закончился. :)
← →
AV © (2012-11-13 17:35) [16]читаем его в клиенте AsFloat
тут оно и читается в переменную как 1e19
передаем обратно в Оракл AsFloat уже 1e19, а не 10000000000000116380, как оно в БД лежит
зы
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
это я всем советую читать
попрошу, не отнимать роль :)
знаю, что случай почти этот,
вернее происходит ожидаемая потеря точности
но надо же было попробовать, как советовали
← →
AV © (2012-11-13 17:38) [17]
> если cardinal так быстро закончился.
да вот и дело, что не закончился
сам по себе, т.е.
а, получается, сиквенс проапдейтили.
не может быть, что так nextval = 10000000000000ххххх
подозрительно как-то
← →
Медвежонок Пятачок © (2012-11-13 17:41) [18]"1,00000000000001E19" is not a valid Oracle Number value.
Ну и где ты переправил, если тебе сам сервер говорит, что ему прилетело 1E19
← →
Аббат Пиккола (2012-11-13 17:42) [19]Может сначала с этим разобраться?
А то ведь и int64 и даже string (шучу) может не хватить. Сначала нужно понять, в чем беда. А то покойник вдруг начнет потом вонять по новой.
← →
Аббат Пиккола (2012-11-13 17:45) [20]Я имею в виду сначала устранить причину переполнения. Там дырка в ID образовалась? Все жестко и ничего не исправить? И причина осталась неизвестной? Обычно причины у подобных грубых вещей лежат на поверхности.
← →
Игорь Шевченко © (2012-11-13 17:49) [21]напридумывают себе ID-ов, потом мучаются
← →
Аббат Пиккола (2012-11-13 17:51) [22]Игорь, что Вы хотите сказать? Вы за предметные ключи? Или у Вас какая-то иная мысль, непроницаемая для простых смертных?
← →
Игорь Шевченко © (2012-11-13 17:55) [23]Аббат Пиккола (13.11.12 17:51) [22]
> Вы за предметные ключи?
Я за разумные решения в каждом конкретном случае. Не зная задачи автора ветки, я не могу дать конкретный ответ, кроме как "бросить это программирование".
Но по первому представлению "привязать услуги к группам" можно
а) по естественным названиям явно
б) передав естественные названия в PL/SQL процедуру, которая разберется с сопоставлением естественного названия и ID
← →
Аббат Пиккола (2012-11-13 18:02) [24]Наверно я вот этого не понимаю:
Есть последовательность (sequence)
И вот этого
похоже, это не "перевалило", а сиквенс переделали
и похоже, репликацию готовят так..
Что за сиквенс такой? Это что, какой-то экзотический тип данных?
← →
Медвежонок Пятачок © (2012-11-13 18:23) [25]oqAddServiceToGroup.ParamByName("ID_GROUP").Value := ID_GROUP;
oqAddServiceToGroup.ParamByName("ID_SERVICES").Value := ID_SERVICE;
oqAddServiceToGroup.ParamByName("ID_GROUP").AsFloat := ID_GROUP;
oqAddServiceToGroup.ParamByName("ID_SERVICES").AsFloat := ID_SERVICE;
← →
AV © (2012-11-13 18:28) [26]
> Медвежонок Пятачок © (13.11.12 18:23) [25]
делал
> AV © (13.11.12 17:03) [8]
---
> Что за сиквенс такой?
ну, может его тупо пересоздали, со стартовым значением = мах из имеющегося + запас
завтра выясню
← →
Медвежонок Пятачок © (2012-11-13 19:15) [27]значит делал не так.
если передавать параметр как флоат, оракл никогда тебе не скажет что
ему не нравится "1,00000000000001E19" просто потому, что оно к нему не прийдет, а прийдет ему флоат значение.
у тебя же на сервер улетает какая-то хрень в виде строки, которую он пытается законвертить в нумбер.
← →
AV © (2012-11-13 19:17) [28]да не, в 8 написано
procedureAddServiceToGroup(const ID_GROUP,ID_SERVICE: Double);
ID_GROUP = 1
ID_SERVICE = 1e19
ID_SERVICE = 1e19
не строка, а именно значение, флоат
потеря точности происходит
← →
Медвежонок Пятачок © (2012-11-13 19:24) [29]а я вижу что уходит строка.
← →
AV © (2012-11-13 19:25) [30]ID_SERVICE = 1e19
а не
ID_SERVICE = "1e19"
реально в отладчике хинт такой
(1e19)
← →
Медвежонок Пятачок © (2012-11-13 19:36) [31]а откуда вдруг в коде литерал 1e19?
это же значение должно быть прочитано из базы.
← →
AV © (2012-11-13 19:40) [32]ставлю бряк
oqAddServiceToGroup.ParamByName("ID_SERVICES").AsFloat := ID_SERVICE;
id_service - переменная
смотрим чему равна
показывает - 1e19
форма записи такая
← →
Cobalt © (2012-11-14 07:53) [33]Знаком с такой фигнёй - типа в разных базах коды разделяются.
в 1-ой - 1000ХХХХ
в 2-ой - 2000ХХХХ
в 3-ой - 3000ХХХХ
Вот вам и вся репликация.
← →
AV © (2012-11-14 08:29) [34]совершенно верно,
> в разных базах коды разделяются.
И последовательность пересоздана по указанию "свыше". Готовится глобальное нечто, походу.
Не буду ничего делать. Пусть string остается.
Работает - не трогай.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.083 c