Dynamic SQL Error SQL error code = -303

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

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

Ответить
Сергей
Сообщения: 13
Зарегистрирован: 10 ноя 2004, 10:35

Dynamic SQL Error SQL error code = -303

Сообщение Сергей » 06 авг 2010, 12:55

Вопрос больше из спортивного интереса.

Есть Firebird 2.0.3.12981 и табличка в базе данных созданная следующим запросом:

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

CREATE TABLE LANGUAGE (

    ID      INTEGER NOT NULL PRIMARY KEY,
    NAME    VARCHAR(3) NOT NULL UNIQUE COLLATE PXW_CYRL,
    BASIC   CHAR(1) DEFAULT '0' NOT NULL CHECK (BASIC IN ('0', '1')),
    DSCR    VARCHAR(100) NOT NULL COLLATE PXW_CYRL
);
И есть код обращения к этой табличке.

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

<?php

$res = false;

$db = ibase_pconnect("localhost:d:/cms/j/database/base.gdb", 'sysdba', 'masterkey');
$tr = ibase_trans(IBASE_WRITE | IBASE_COMMITTED | IBASE_WAIT | IBASE_REC_NO_VERSION, $db);

if ($query = ibase_query($db, $tr, "SELECT COUNT(*) FROM LANGUAGE WHERE NAME = ?", "english")) {

    $row = ibase_fetch_row($query);
    $res = $row[0] != 0;
    ibase_free_result($query);
}

ibase_close($db);

var_dump($res);

?>
И есть результат.
Dynamic SQL Error SQL error code = -303 arithmetic exception, numeric overflow, or string truncation
Почему если использовать параметризированный запрос ошибка есть:
ibase_query($db, $tr, "SELECT COUNT(*) FROM LANGUAGE WHERE NAME = ?", "english")
А если параметр в запросе не использовать – ошибки нет.
ibase_query($db, $tr, "SELECT COUNT(*) FROM LANGUAGE WHERE NAME = 'english'")
Чем такое поведение можно объяснить?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Dynamic SQL Error SQL error code = -303

Сообщение Dimitry Sibiryakov » 06 авг 2010, 13:51

Тем, что параметр принимает тип поля. А 'english' ну никак не влазит в VARCHAR(3).

Сергей
Сообщения: 13
Зарегистрирован: 10 ноя 2004, 10:35

Re: Dynamic SQL Error SQL error code = -303

Сообщение Сергей » 06 авг 2010, 14:20

И что делать?
Стараться не использовать запросы с параметрами?

Почему тогда этот код работает?
ibase_query($db, $tr, "SELECT COUNT(*) FROM LANGUAGE WHERE NAME = 'english'")

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Dynamic SQL Error SQL error code = -303

Сообщение Dimitry Sibiryakov » 07 авг 2010, 13:53

Сергей писал(а):И что делать?
Стараться не использовать запросы с параметрами?
Пытаться использовать мозг хоть время от времени.

"Этот код" может быть и работает, но должен всегда возвращать пустой результат. По крайней мере с приведённым DDL.

Ответить