Регистр объектов

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

Модераторы: kdv, Pavel Kutakov

Ответить
Энди Таккер
Сообщения: 10
Зарегистрирован: 03 фев 2007, 10:12

Регистр объектов

Сообщение Энди Таккер » 08 фев 2007, 13:16

Создаю процедуру:

Код: Выделить всё

CREATE OR ALTER PROCEDURE TEST_CASE 
AS 
  declare variable Test_Var Integer;
begin
  Test_Var = 1;
end
Компилируется нормально.
В редакторе подсвечивает Test_Var красным и говорит "Неизвестная переменная". Отладчик на этой строке останавливается со словами: Column unknown. "TEST_VAR".
Насколько я понимаю, если название объекта явно не брать в кавычки, то регистр символов не учитывается. test_var и Test_Var должны быть эквивалентны и не вызывать такой реакции парсера.
В настройках базы включено "Использовать регистрочувствительные идентификаторы".
FB 2.0.1 Dialect 3.

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

Re: Регистр объектов

Сообщение Pavel Kutakov » 18 фев 2007, 23:34

Энди Таккер писал(а): В настройках базы включено "Использовать регистрочувствительные идентификаторы".
FB 2.0.1 Dialect 3.
В данной конкретной ситуации это особенность работы с локальными переменными при наличии вышеуказанной опции. Т.е. система считает, что уж коли вы начали использовать кавычки, то будете последовательны в этом.

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

Сообщение kdv » 19 фев 2007, 00:50

В настройках базы включено "Использовать регистрочувствительные идентификаторы".
если имеется в виду IBExpert, то там наоборот, галка "всегда использовать регистроНЕчувствительные имена объектов".

включить как надо, пересоздать объекты.
http://www.ibase.ru/ibfaq.htm#dtproblem

p.s. читать faq перед работой.

Энди Таккер
Сообщения: 10
Зарегистрирован: 03 фев 2007, 10:12

Сообщение Энди Таккер » 19 фев 2007, 14:11

kdv писал(а): p.s. читать faq перед работой.
Я понимаю как работает 3-ий диалект с регистрами символов в названиях объектов. В данном случае мне не понятно поведение студии.
Pavel Kutakov писал(а): В данной конкретной ситуации это особенность работы с локальными переменными при наличии вышеуказанной опции
Если поставить галку "Использовать регистрочувствительные идентификаторы", то имеем вышеописанное поведение. Если убрать, то метаданные для объектов, в именах которых использовались кавычки, становятся недоступными для работы. Т.е. тела процедур не показываются, скрипты таблиц, данные таблиц тоже не доступны.
Честно говоря, мне не совсем понятен смысл использования этого переключателя. Либо я явно задаю регистр символов ставя кавычки, либо если я кавычки не ставлю, то регистр мне по барабану, и я волен писать переменные как угодно, не заботясь о совпадении регистра букв.
kdv писал(а): если имеется в виду IBExpert, то там наоборот, галка "всегда использовать регистроНЕчувствительные имена объектов"
В эксперте есть галка "Всегда приводить имена объектов к верхнему регистру". Если ее не включать, то он регистры не трогает и никаких затруднений при работе не возникает. Т.е. если явно в скрипте руками написать Test_Var (без кавычек), то она так и останется Test_Var и отладчик с этим нормально работает.

Энди Таккер
Сообщения: 10
Зарегистрирован: 03 фев 2007, 10:12

Сообщение Энди Таккер » 19 фев 2007, 14:34

И еще, видимо проблема из той же оперы.
База одна и таже. Одно подключение через студию, другое через IBExpert.
Читаю метаданные процедуры.
Через студию:

Код: Выделить всё

CREATE OR ALTER PROCEDURE "pr_Is_Parent_Oil" (IN_PARENT_GOOD_ID BIGINT,
       IN_GOOD_ID        BIGINT)
returns (IS_PARENT BIGINT)
AS 
  declare variable "Parent_Good_ID" bigint;
begin
  while ((in_Good_ID <> 0) and (in_Good_ID <> in_parent_good_id))do
  begin
    select
      g."Parent_Good_ID"
    from
      "sa_Goods" g
    where
      g."Good_ID" = :in_good_id
    into
      :parent_good_id;
    in_Good_ID = parent_good_id;
  end
  if (in_good_id = in_parent_good_id) then
    is_parent = 1;
  else
    is_parent = 0;
    suspend;
end
Через эксперт:

Код: Выделить всё

CREATE PROCEDURE "pr_Is_Parent_Oil"(
    IN_PARENT_GOOD_ID BIGINT,
    IN_GOOD_ID BIGINT)
RETURNS (
    IS_PARENT BIGINT)
AS
declare variable Parent_Good_ID bigint;
begin
  while ((in_Good_ID <> 0) and (in_Good_ID <> in_parent_good_id))do
  begin
    select
      g."Parent_Good_ID"
    from
      "sa_Goods" g
    where
      g."Good_ID" = :in_good_id
    into
      :parent_good_id;
    in_Good_ID = parent_good_id;
  end
  if (in_good_id = in_parent_good_id) then
    is_parent = 1;
  else
    is_parent = 0;
    suspend;
end
Обратите внимание на декларацию переменной в процедуре. Студия показывает кавычки, экперт нет и он прав.

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

Сообщение Pavel Kutakov » 19 фев 2007, 15:28

Ну говорю же - особенность. При разборе локальных переменных студия не запоминает, была переменная в кавычках или нет. И если для базы чувствительность к регистру включена, то и для этой переменной кавычки выставляются (ведь она маленькими буквами).

Энди Таккер
Сообщения: 10
Зарегистрирован: 03 фев 2007, 10:12

Сообщение Энди Таккер » 19 фев 2007, 16:40

Так тело же процедуры хранится в системных таблицах в явном виде? Т.е. если кавычки есть, то они есть, нет - значит нет. Или я не прав?

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

Сообщение Pavel Kutakov » 19 фев 2007, 18:42

Да, локальные переменные хранятся явно. Но чтобы с ними работать - этот блок парсится. И так как во всех других местах определить наличие кавычек в общем случае можно только учитывая настройку и регистр имени объекта, то и для этого места исключений не делалось. Я согласен, что в данном конкретном случае софт работает не совсем верно и мы попробуем это исправить. Но все же ИМХО, где-то использовать кавычки, а где то не использовать - это уж слишком. За 4 года что софт поддерживает работу с кавычками (или уже больше с выхода IB6.0 прошло ?) вы первый кто обратился с такой проблемой.

Энди Таккер
Сообщения: 10
Зарегистрирован: 03 фев 2007, 10:12

Сообщение Энди Таккер » 19 фев 2007, 19:02

Привычка. В названиях объектов использую кавычки для большей выразительности. Внутри процедур пользоваться кавычками смысла нет, т.к. регистр символов остается без изменений. Почему нет? - сервер позволяет.

Ответить