Параметр в списке полей оператора SELECT — ошибка: неизвестный тип данных

#firebird

#firebird #firebird-3.0

Вопрос:

У меня проблема с Firebird (встроенной) базой данных. Я хотел бы задать значения параметра в операторе select. Например:

 SELECT name, surname, :string AS myText
FROM myTable
  

где :string — параметр.
Приведенный выше код работает в SQLite, и результатом является (когда параметром является «abcdef»):

  ------ --------- --------- 
|name  |surname  |myText   |
 ------ --------- --------- 
|John  |Black    |abcdef   |
 ------ --------- --------- 
|Thomas|Young    |abcdef   |
 ------ --------- --------- 
|...   |...      |abcdef   |
 ------ --------- --------- 
|nameX |surnameY |abcdef   |
 ------ --------- --------- 
  

Когда я пытаюсь выполнить этот запрос, я получаю следующее сообщение: «Была обнаружена ошибка во входных параметрах прикладной программы для инструкции SQL.

 Dynamic SQL Error.
SQL error code = -804.
Data type unknown.
  

Ответ №1:

Проблема в том, что Firebird необходимо знать тип данных параметра. IIRC в SQLite все является строкой, но в Firebird это не так.

Вам нужно будет явно привести параметр, чтобы сообщить Firebird об ожидаемом типе, например:

 SELECT name, surname, cast(? as varchar(100)) AS myText
FROM myTable
  

Где ? — позиционный параметр. Firebird не имеет именованных параметров (за исключением процедур), но если ваша библиотека access имитирует именованные параметры, то, вероятно, следующее также будет работать:

 SELECT name, surname, cast(:string as varchar(100)) AS myText
FROM myTable
  

Возможность приведения параметров в предложении select- не работает в более старой версии Firebird (я полагаю, что это было введено в Firebird 2.5, но я не уверен на 100%).