Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.074 c
15-1330707938
ClawClaw
2012-03-02 21:05
2013.03.22
Внезапно стал выключаться ноутбук


15-1336837860
dmk
2012-05-12 19:51
2013.03.22
Отпуск


2-1337444696
SKIPtr
2012-05-19 20:24
2013.03.22
проверка на наличие дочерних окон


15-1339585593
KSergey
2012-06-13 15:06
2013.03.22
Про собеседы-то зачем ветку удалили?!


2-1338379393
мтк
2012-05-30 16:03
2013.03.22
Создание формы по имени класса и передача параметров конструктору





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский