EXECUTE STATEMENT ... INTO - несовместимость типов

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

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

Ответить
Desdechado
Сообщения: 19
Зарегистрирован: 02 авг 2005, 18:53

EXECUTE STATEMENT ... INTO - несовместимость типов

Сообщение Desdechado » 02 авг 2005, 19:08

FB 1.5.2
Наковырял такую неприятность. В таблице поле s_id типа SMALLINT. В процедуре пишу
EXECUTE STATEMENT 'SELECT s_id FROM Tablica' INTO :n;
При этом объявлено
DECLARE VARIABLE n INTEGER;
При выполнении процедуры на приведенной конструкции ругается о несовместимости типов. Всегда считал, что SMALLINT приводится к INTEGER весьма легко...
Если сделать одного типа (и поле, и переменную), то все гуд.
Последний раз редактировалось Desdechado 02 авг 2005, 21:39, всего редактировалось 1 раз.

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

Сообщение Merlin » 02 авг 2005, 19:19

Долго ковырял-то? В релизных нотах написано, на стр 22, третьей по счёту и последней про execute statement.

Desdechado
Сообщения: 19
Зарегистрирован: 02 авг 2005, 18:53

Сообщение Desdechado » 02 авг 2005, 21:49

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

если имелось ввиду вот это
Return values are strictly checked for data type in order to avoid unpredictable type-casting
exceptions. For example, the string ’1234’ would convert to an integer, 1234, but ’abc’ would give
a conversion error.

то, имхо, второе предложение не так очевидно, как вам показалось. Там, вроде, написано, что строка БУДЕТ конвертироваться. Я же вообще числа, причем совместимые по типам снизу вверх, конвертирую.

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

Сообщение Merlin » 02 авг 2005, 22:11

Когда мне кажется, я крещусь.

Return values are strictly checked for data type in order to avoid unpredictable type-casting
exceptions. For example, the string ’1234’ would convert to an integer, 1234, but ’abc’ would give
a conversion error.

Перевожу:

Возвращаемые значения жёстко контролируются по типам во избежание непредсказуемых ошибок преобразования типов. НАПРИМЕР (компрене ву? например!) при няевных преобразованиях строк строка содержащая '1234' успешно конвертируется в целое, а содержащая 'абеце' будет приводить к возникновению исключения.

Так вот. Намекаю. Никто не мешает благородному дону закастить свой smallint в int явно внутри запроса. И строку тоже, если человек понимает что он делает и берёт на себя ответственность. А вот автомат в данном случае за него этого делать не будет, слишком много вариантов и велика вероятность втихомолку выдавать не то, что мы с тобой ожидаем.

Desdechado
Сообщения: 19
Зарегистрирован: 02 авг 2005, 18:53

Сообщение Desdechado » 02 авг 2005, 23:03

Благодарю за подробные объяснения.

Мне проще объявить переменную другого типа, подходящего :)

Ответить