Модераторы: kdv, Pavel Kutakov
-
VVJ
- Сообщения: 9
- Зарегистрирован: 11 авг 2006, 02:00
Сообщение
VVJ » 01 мар 2007, 00:03
Добрый вечер. Сервер FB 1.5. FB-IB Studio -инструмент после работы в IBExpert немного непривычен по интерфейсу, но если бы начинал с 0 работать с ним, то все было бы привычно - человеческая инертность. Много несомненных преимуществ. Полезный режим проверки ошибок в коде базы. Выявил довольно много фигни в виде хинтов и прямых ошибок. Но ... Объясните:
Код: Выделить всё
CREATE OR ALTER PROCEDURE SP_ANL_MAIN_DESC
(NM_ANL Varchar(10) , ID Integer)
returns (DSC_ANL Varchar(100))
AS
declare variable NMTBL VARCHAR(30);
declare variable NMFLD VARCHAR(30);
begin
select a.nm_tbl,a.nm_fld from spranal_cnf a
where a.nm_spr = :NM_ANL and a.nom_fld_view = 1
into :nmtbl,:nmfld;
execute statement 'select '||nmFld||' from '||nmTbl||' where id '||:ID into:dsc_anl;
suspend;
end
Почему на nmFld и nmTbl дает ошибку "неизвестное поле". Ставишь ' : ', все ОК, хотя компилятору FB 1.5 по барабану - что есть ' : ' что нет .
Как правильно? В примерах SQL.extensions по execute statement (doc FB 1.5) вообще никаких двоеточий нет, хотя для себя интуитивно выведено правило - то что входной параметр - то с двумя точками, то что локальная переменная - без них. Так ли это?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 01 мар 2007, 01:32
Так ли это?
не так. лично я любую переменную пишу в процедуре или триггере с двоеточием.
Кстати, Вы уверены, что Вам execute statement надо? я вот сильно сомневаюсь.
-
VVJ
- Сообщения: 9
- Зарегистрирован: 11 авг 2006, 02:00
Сообщение
VVJ » 01 мар 2007, 09:46
Спасибо. А насчет execute statement - прекрасно понимаю, что это тянет время на компиляцию, но есть ситуации, когда без этого не обойтись.
-
VVJ
- Сообщения: 9
- Зарегистрирован: 11 авг 2006, 02:00
Сообщение
VVJ » 01 мар 2007, 09:53
Вдогонку. В этой процедурке мне нужно вернуть значение аналитики для любого справочника системы (т.е. из заранее неизвестных таблицы и поля), созданных по оговоренным общим правилам , о описанных в конфигурационных таблицах.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 01 мар 2007, 09:55
но есть ситуации, когда без этого не обойтись.
Да? И как же мы жили почти что 10 лет (а кто и 20) без Execute Statement?
Вот Вы с InterBase/Firebird сколько работаете?
-
Slavik
- Сообщения: 115
- Зарегистрирован: 17 янв 2007, 11:52
Сообщение
Slavik » 01 мар 2007, 10:01
VVJ писал(а):Почему на nmFld и nmTbl дает ошибку "неизвестное поле".
Если бы ты почитал ветку про IBStudio, то возможно нашёл бы ответ (сам я ей не пользуюсь). Там было что-то про локальные переменные в процедурах и их регистрозависимость.
VVJ писал(а):Ставишь ' : ', все ОК, хотя компилятору FB 1.5 по барабану - что есть ' : ' что нет. Как правильно?
Компилятору "по барабану", если это не SQL-запрос (select, insert, update, delete). Иначе, если нет двоеточия, компилятор будет считать, что это ссылка на поле одной из таблиц в запросе. И хорошо, если такого поля нет. Компилятор просто ругнётся. А если такое поле есть...
-
Pavel Kutakov
- Сообщения: 37
- Зарегистрирован: 16 июн 2006, 12:50
Сообщение
Pavel Kutakov » 07 мар 2007, 21:53
Slavik писал(а):VVJ писал(а):Почему на nmFld и nmTbl дает ошибку "неизвестное поле".
Если бы ты почитал ветку про IBStudio, то возможно нашёл бы ответ (сам я ей не пользуюсь). Там было что-то про локальные переменные в процедурах и их регистрозависимость.
Нет, там регистрозависимость локальных переменных была при использовании базы с регистрозависимыми идентификаторами. Тут, насколько я вижу, такого нет.
А ошибку он пишет потому, что в данный момент в парсере забито так, что двоеточие позвояется игнорировать только в выражениях. Посмотрим что можно исправить тут.