В результате исследований вошел в ступор :
- для FB 2 - длина строки c запросом не может превышать 30 символов ?
- для FB 1.5 - длина строки c запросом чуть длиннее?
причем при выполнении пробовал и из переменной и в явном виде в кавычках - срезает и ругается. У меня же не запрос длинный и по взрослому.
Зачем ?
EXECUTE STATEMENT и Firebird
-
- Сообщения: 2
- Зарегистрирован: 07 ноя 2006, 22:57
Нет !! блин вот пример
/* таблица 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
/* таблица 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
мда. запрос мощный. да еще его в execute statement. воистину...
почитай www.ibase.ru/devinfo/joins.htm на досуге.
почитай www.ibase.ru/devinfo/joins.htm на досуге.