Проблема с execute statement в FB 1.5.1

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

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

Ответить
a3a3ello

Проблема с execute statement в FB 1.5.1

Сообщение a3a3ello » 25 ноя 2004, 12:56

В ХП выполняется запрос

select client, sum(kolich), count(*)
from tablename
where date1='03.10.2004'
group by 1';

выполняется без проблем. Но когда тот же запрос я вставляю в переменную и выполняю через execute statement выдается ошибка, что какое-то значение должно быть 0 - 32767. При удалении count(*) ошибка исчезает. В чем может быть дело ?
Спасибо.

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

Сообщение dimitr » 25 ноя 2004, 13:06

Какое именно значение? Приведи точное сообщение об ошибке.

a3a3ello

Сообщение a3a3ello » 25 ноя 2004, 13:28

Сообщение такое

Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
numeric value between 0 and 32767 inclusive required.



Все поля таблиц и параметры ХП используемые в этом запросе у меня bigint. Так, что никакого переполнения быть не должно.

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

Сообщение dimitr » 25 ноя 2004, 14:54

На клиенте firebird.msg обнови для начала. Полагаю, что кавычка после GROUP BY 1 - опечатка? В какие переменные вставляешь результат? Как пить дать, у тебя налицо несовпадение типов.

a3a3ello

Сообщение a3a3ello » 25 ноя 2004, 15:27

Вставляю client в varchar, sum и count в bigint. Да вопрос по моему не в этом ведь точно такой же запрос без execute statement с теми же переменными работает и без count работает ! Может это глюк какой? Попробуйте кто-нибудь у себя запустить подобную ХП. Таблица у меня 1,5 млн записей.

Спасибо.

a3a3ello

Сообщение a3a3ello » 25 ноя 2004, 15:45

Только что выяснил, что размер таблицы не имеет значения. При двух записях та же фигня.

a3a3ello

Совсем тоска

Сообщение a3a3ello » 25 ноя 2004, 16:05

Упростил запрос до предела

begin
txt_sql = 'select count(*) from table_try';
for execute statement main_sql
into :kolichstvo do
begin
suspend;
end


Выдает ошибку. Если вместо count(*) подставить что -то другое : sum(), avg(), просто поле, то работает нормально.

a3a3ello

заработало

Сообщение a3a3ello » 25 ноя 2004, 18:26

Если кому еще интересно : выходной параметр в который выталкивалось поле count(*) был bigint. сделал его int и все заработало. Хотя конечно интересно почему так не адекватно реагировал только count(). Может разработчикам наябедничать ?

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

Сообщение dimitr » 25 ноя 2004, 18:32

a3a3ello писал(а):Вставляю client в varchar, sum и count в bigint. Да вопрос по моему не в этом ведь точно такой же запрос без execute statement с теми же переменными работает и без count работает !
Читаем RelNotes, стр. 22:

4. Return values are strictly checked for data type in order to avoid unpredictable type-casting exceptions.

Проверяем, какой тип данных возвращает count. Оказывается, что INT. А пихаем его в BIGINT. Перечитываем вышеприведенный абзац еще раз. Думаем. Меняем переменную на INT. Радуемся жизни.

Ответить