EXECUTE STATEMENT и Firebird

ЧАстые Вопросы и Ответы

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

Ответить
Дамир
Сообщения: 4
Зарегистрирован: 15 ноя 2006, 13:37

EXECUTE STATEMENT и Firebird

Сообщение Дамир » 15 ноя 2006, 13:43

В результате исследований вошел в ступор :
- для FB 2 - длина строки c запросом не может превышать 30 символов ?
- для FB 1.5 - длина строки c запросом чуть длиннее?

причем при выполнении пробовал и из переменной и в явном виде в кавычках - срезает и ругается. У меня же не запрос длинный и по взрослому.

Зачем ?

Malinovsky Vladimir
Сообщения: 2
Зарегистрирован: 07 ноя 2006, 22:57

Сообщение Malinovsky Vladimir » 18 ноя 2006, 08:54

Это что, шутка была?

Дамир
Сообщения: 4
Зарегистрирован: 15 ноя 2006, 13:37

Сообщение Дамир » 20 ноя 2006, 21:41

Нет !! блин вот пример

/* таблица GROSS_LINKS
поля GROSSLINK,ISDT,LINK
значения 1, 1, 1
1,1,2
................. число не ограничено

задача - найти все значения поля GROSSLINK для LINK=1,2,... (одновременно)
*/

CREATE PROCEDURE LIST
RETURNS
(CODE INTEGER,
ISDT INTEGER)
AS
declare variable SQL varchar(500);
BEGIN

/* если написать так */
SQL = 'SELECT GROSSLINK,isdt FROM GROSS_LINKS WHERE GROSSLINK in (SELECT GROSSLINK FROM GROSS_LINKS WHERE LINK=1) and LINK=2';
FOR EXECUTE statement SQL into :CODE,:ISDT
/* тогда выходит ошибка при выполнении
Unsucceful execution caused by an unavailable resource.
Variable type (position 1) in EXECUTE STATEMENT 'SELECT GROSSLINK,isdt FROM GROS' into doesnot match returned column type.
at procedure 'LIST'. */

/* а если написать так */
SQL = 'SELECT GROSSLINK FROM GROSS_LINKS WHERE GROSSLINK in (SELECT GROSSLINK FROM GROSS_LINKS WHERE LINK=1) and LINK=2';
FOR EXECUTE statement SQL into :CODE
/* тогда все проходит !!! */

/* Я так понял, что можно только одно поле вывести ?!!!
НО ХОЧЕТСЯ ПОИМЕТЬ еще и ISDT */

DO BEGIN
SUSPEND;
end
END

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

Сообщение Merlin » 20 ноя 2006, 22:22

Оставив в стороне и необходимость применения ES и смысл запроса, рекомендую не фантазировать, а прочитать вынимательно вот это:
Variable type (position 1) in EXECUTE STATEMENT 'SELECT GROSSLINK,isdt FROM GROS' into doesnot match returned column type.
и попробовать понять.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 ноя 2006, 12:28

мда. запрос мощный. да еще его в execute statement. воистину...

почитай www.ibase.ru/devinfo/joins.htm на досуге.

Дамир
Сообщения: 4
Зарегистрирован: 15 ноя 2006, 13:37

Сообщение Дамир » 22 ноя 2006, 08:56

Всем спасибо !!! Сам дурак.

ISDT в таблице SMALLINT
а в запросе INTO :ISDT был INTEGER

хотя если написать запрос влоб без EXECUTE все работает

Ответить