Страница 1 из 1

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

Добавлено: 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.

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

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

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

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

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

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

Добавлено: 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
Обратите внимание на декларацию переменной в процедуре. Студия показывает кавычки, экперт нет и он прав.

Добавлено: 19 фев 2007, 15:28
Pavel Kutakov
Ну говорю же - особенность. При разборе локальных переменных студия не запоминает, была переменная в кавычках или нет. И если для базы чувствительность к регистру включена, то и для этой переменной кавычки выставляются (ведь она маленькими буквами).

Добавлено: 19 фев 2007, 16:40
Энди Таккер
Так тело же процедуры хранится в системных таблицах в явном виде? Т.е. если кавычки есть, то они есть, нет - значит нет. Или я не прав?

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

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