Неявное приведение типов в FB

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

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

Ответить
cav
Сообщения: 21
Зарегистрирован: 18 май 2006, 13:25

Неявное приведение типов в FB

Сообщение cav » 28 июл 2006, 05:45

Натолкнулся на следующее поведение системы, имеет ся таблица

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

CREATE TABLE R$OSTATOK (
    USERID       INTEGER NOT NULL,
    GUID         INTEGER NOT NULL,
    PLACEINDEX   INTEGER NOT NULL,
    QUANTITY     DOUBLE PRECISION DEFAULT 0,
    QUANTITYALL  DOUBLE PRECISION DEFAULT 0,
    MODEDATE     DATE DEFAULT current_date
);
чего она делает неважно, а важно то что она заполняется в процедуре где имеются следующие определения:

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

CREATE PROCEDURE CALC_ONE_OSTATOK_DATA (
     ..........
RETURNS (
    PLACEINDEX VARCHAR(80),
    QUANTITY DOUBLE PRECISION,
    QUANTITYALL DOUBLE PRECISION)
.......
И в теле процедуры имеется к примеру такой кусок кода :

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

  /* приход и произведенная продукция*/
   for
    select ns.guid,nh.client2index,sum(ns.quantity) as quantity,sum(ns.quantityall) as quantityall from naclhead nh
     left join naclspec ns on nh.id=ns.id and nh.inout=ns.inout
    where nh.inout in (0,5,4) and nh.docdate<=:pdate and nh.used='T' and ns.guid=:PGUID
    group by ns.guid,nh.client2index
    into :LGUID,:placeindex,:LQUANTITY,:LQUANTITYALL
   do begin
    insert into r$ostatok (userid,guid,placeindex,quantity,quantityall)
    values (:puserid,:lguid,:placeindex,:lquantity,:lquantityall);
   end
т.е. :PLACEINDEX у нас внутри процедуры итмеет тип VARCHAR а PLACEINDEX у таблице INTEGER - данный код работаеть правильно уже больше года на FB 1.xxx. Я считал что FB не допускает неявное приведение типов, а тут такой странный эффект.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 28 июл 2006, 07:46

неявные приведения типов всегда допускались. Начиная с IB6/FB1, в третьем диалекте введена строгая типизация в выражениях, где теперь требуются только совместимые типы. Но к операциям присваивания это отношения не имеет.

cav
Сообщения: 21
Зарегистрирован: 18 май 2006, 13:25

Сообщение cav » 28 июл 2006, 08:17

Ага.... Спасибо за разяснения. А то я подумал что если в выражениях должно быть жосткое приведение, и присваивание тоже должно быть жосткое :)

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

Сообщение Merlin » 28 июл 2006, 13:42

Очень советую именно так думать и дальше, пользуясь неявным сознательно в исключительных случаях. Код будет малость поширше, но граблей обойдёшь просто шквал.

Ответить