Страница 1 из 1

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'")
Чем такое поведение можно объяснить?

Re: Dynamic SQL Error SQL error code = -303

Добавлено: 06 авг 2010, 13:51
Dimitry Sibiryakov
Тем, что параметр принимает тип поля. А 'english' ну никак не влазит в VARCHAR(3).

Re: Dynamic SQL Error SQL error code = -303

Добавлено: 06 авг 2010, 14:20
Сергей
И что делать?
Стараться не использовать запросы с параметрами?

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

Re: Dynamic SQL Error SQL error code = -303

Добавлено: 07 авг 2010, 13:53
Dimitry Sibiryakov
Сергей писал(а):И что делать?
Стараться не использовать запросы с параметрами?
Пытаться использовать мозг хоть время от времени.

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