Проверка ошибок в коде

все вопросы и ответы о среде для разработчиков от www.sqlly.com

Модераторы: 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

Re: Проверка ошибок в коде

Сообщение Slavik » 01 мар 2007, 10:01

VVJ писал(а):Почему на nmFld и nmTbl дает ошибку "неизвестное поле".
Если бы ты почитал ветку про IBStudio, то возможно нашёл бы ответ (сам я ей не пользуюсь). Там было что-то про локальные переменные в процедурах и их регистрозависимость.
VVJ писал(а):Ставишь ' : ', все ОК, хотя компилятору FB 1.5 по барабану - что есть ' : ' что нет. Как правильно?
Компилятору "по барабану", если это не SQL-запрос (select, insert, update, delete). Иначе, если нет двоеточия, компилятор будет считать, что это ссылка на поле одной из таблиц в запросе. И хорошо, если такого поля нет. Компилятор просто ругнётся. А если такое поле есть... :cry:

Pavel Kutakov
Сообщения: 37
Зарегистрирован: 16 июн 2006, 12:50

Re: Проверка ошибок в коде

Сообщение Pavel Kutakov » 07 мар 2007, 21:53

Slavik писал(а):
VVJ писал(а):Почему на nmFld и nmTbl дает ошибку "неизвестное поле".
Если бы ты почитал ветку про IBStudio, то возможно нашёл бы ответ (сам я ей не пользуюсь). Там было что-то про локальные переменные в процедурах и их регистрозависимость.
Нет, там регистрозависимость локальных переменных была при использовании базы с регистрозависимыми идентификаторами. Тут, насколько я вижу, такого нет.
А ошибку он пишет потому, что в данный момент в парсере забито так, что двоеточие позвояется игнорировать только в выражениях. Посмотрим что можно исправить тут.

Ответить