powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по двойственности (теоретический)
22 сообщений из 22, страница 1 из 1
Вопрос по двойственности (теоретический)
    #40009701
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут в очередной раз наткнулся на очень неприятную ситуацию с параметром и полем. Поэтому хочу переговорить в первую очередь с разработчиками FB о ней.
1. Есть таблица, в ней поле, к примеру, ID.
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE SIMPLE_TABLE (
    ID            INTEGER NOT NULL,
    DATE_ACCOUNT  DATE NOT NULL
);

ALTER TABLE SIMPLE_TABLE ADD CONSTRAINT PK_SIMPLE_TABLE PRIMARY KEY (ID);


2. Есть ХП, которая получает данные из неё.
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR ALTER PROCEDURE TEST_AMBIG (
    DATE_ACCOUNT DATE)
AS
DECLARE VARIABLE ID_RECORD INTEGER;
BEGIN
    ID_RECORD = (SELECT T.ID FROM SIMPLE_TABLE T WHERE T.DATE_ACCOUNT = :DATE_ACCOUNT);
END


Это абсолютно корректная ХП, которая делает то, что надо.
Но, если немного ошибиться, и забыть указать двоеточие у параметра DATE_ACCOUNT, то сервер это скомпилирует и по сути получится условие "A.DATE_ACCOUNT = A.DATE_ACCOUNT". Хорошо, если в таблице более одной записи, то получаешь multiple rows и пытаешься найти причину. Но если в запросе стоит FIRST 1 и ORDER BY, то это можно обнаружить только тогда, когда начинаешь получать несколько не те данные, что ожидаешь.
Бывает другой случай: селект для INSERT или просто селект: должно быть "SELECT ID, :DATE_ACCOUNT FROM ...", а разраб по ошибке пишет "SELECT ID, DATE_ACCOUNT FROM ...".

Вопрос разработчикам - можно ли сделать проверку на то, что если имя поля указано без альяса и есть параметр с таким именем, выдавать про двойственность, по аналогии с "Ambiguous field name"? Или как вариант запретить ссылаться на поле без указания альяса, если у таблицы есть альяс.
Я понимаю, что здесь больше про человеческий фактор, но тем не менее. Я напишу Хвастунову, чтобы он добавил такую проверку в парсере, но не факт, что он будет такое делать. В любом случае, хотелось бы видеть такое непосредственно в сервере.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009703
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax
Я напишу Хвастунову, чтобы он добавил такую проверку в парсере, но не факт, что он будет такое делать.


Точно не будет, я только что у него спросил.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009715
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIELD=FIELD - нормальное условие, как и1=1.
Кроме того вполне возможно условие FIELD1=FIELD2. И с параметрами так же можно перепутать.
Не знаю, чего тут бояться.
Я наоборот в последнее время полюбил делать параметры такие, как поля - не ошибешься, и копипаст быстрее и удобнее. Пишешь поле=:поле, да и всё.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009717
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я использовал и использую FIELD=FIELD, как раз в процедуре.
Чтобы триггера сработали, обновляю все записи выборки.
Правда, в SET, а не в WHERE, но всё же.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009722
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

видимо, надо менять стиль написания кода? В частности, именования параметров.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009723
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
FIELD=FIELD - нормальное условие, как и1=1.

Ты не понял. Речь про то, что FIELD может оказаться как полем таблицы, так и параметром.
Если нет параметра с именем FIELD (выходного или входного) - считаем, что все ОК.

YuRock
Кроме того вполне возможно условие FIELD1=FIELD2. И с параметрами так же можно перепутать.

См. предыдущий ответ.

YuRock
Я наоборот в последнее время полюбил делать параметры такие, как поля - не ошибешься, и копипаст быстрее и удобнее. Пишешь поле=:поле, да и всё.

Собственно, так и делаю. Но стоит пропустить двоеточие перед именем параметра и не увидеть этого...
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009728
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
видимо, надо менять стиль написания кода? В частности, именования параметров.

Возможно. Если другие разрабы поделятся, как у них это сделано и почему именно так, подумаю над этим.
Давным-давно я пробовал вырвиглазные конструкции с префиксами типа "IN_", "OUT_", "V_", "VAR_" и т.д, но это оказалось жутко неудобно как в части написания кода, так и работы с такими ХП.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009734
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в EXECUTE BLOCK сделана поддержка связывания имен.
Код: sql
1.
2.
3.
4.
5.
6.
EXECUTE BLOCK (IN_ID INTEGER = :ID)
AS
DECLARE VARIABLE VAR_ID INTEGER;
BEGIN
    :VAR_ID = :IN_ID + 1;
END


Снаружи для все это параметр ID, а внутри - имя такое, какое надо.
В случае ХП такого нету. Поэтому если объявлять вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR ALTER PROCEDURE TEST_SP (
    IN_ID INTEGER)
RETURNS (
    OUT_ID INTEGER)
AS
BEGIN
    :OUT_ID = :IN_ID + 1;
    SUSPEND;
END


то выборка получается через "SELECT OUT_ID FROM TEST_SP(1)".

Написать вот так, к сожалению, нельзя:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR ALTER PROCEDURE TEST_SP (
    IN_ID INTEGER = :ID)
RETURNS (
    ID INTEGER = :OUT_ID)
AS
BEGIN
    :OUT_ID = :IN_ID + 1;
    SUSPEND;
END
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009736
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax,

я не использую префикс : для переменных вне запросов.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009737
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax

Возможно. Если другие разрабы поделятся, как у них это сделано и почему именно так, подумаю над этим.
Давным-давно я пробовал вырвиглазные конструкции с префиксами типа "IN_", "OUT_", "V_", "VAR_" и т.д, но это оказалось жутко неудобно как в части написания кода, так и работы с такими ХП.


Можно просто всегда использовать параметры/переменные с двоеточием. И в редакторе того же эксперта раскрасить их в свой цвет.
Бонусом code insight после двоеточия будет вываливать только параметры/переменные, а не все подряд.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009740
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
я не использую префикс : для переменных вне запросов.

Предлагаемое ограничение никак на этом не отразится.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009742
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Можно просто всегда использовать параметры/переменные с двоеточием.

Я так и делаю, кроме случаев, когда параметр в левой части - привычка с до-FB3 времен. Но в новых ХП/пакетах или при редактировании старых, если не лень, добавляю.

IBExpert
И в редакторе того же эксперта раскрасить их в свой цвет.

Отличный вариант.
Суть в том, что глаз замыливается и не всегда удается заметить, что где-то не хватает двоеточия или наоборот, оно не нужно.
Если параметр будет окрашен в другой цвет (а в идеале разный цвет для входных, выходных и переменных), то отсутствие двоеточия будет сразу видно.

IBExpert
Бонусом code insight после двоеточия будет вываливать только параметры/переменные, а не все подряд.

Так там и сейчас только переменные.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009747
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax

Если параметр будет окрашен в другой цвет


Ну так раскрась. Эксперт это с незапамятных времен умеет.

CyberMax

IBExpert
Бонусом code insight после двоеточия будет вываливать только параметры/переменные, а не все подряд.

Так там и сейчас только переменные.


Ctrl+Space вывалит все, если нет двоеточия. А специальный шорткат для переменных я и не помню даже.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009756
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax

Ты не понял. Речь про то, что FIELD может оказаться как полем таблицы, так и параметром.
Если нет параметра с именем FIELD (выходного или входного) - считаем, что все ОК.
Да всё я понял.
И если параметр есть и используется в другом месте - то тоже должно быть всё нормально.
IN_ и OUT_ я раньше добавлял, потом забил.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009780
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Ну так раскрась. Эксперт это с незапамятных времен умеет.

Спасибо. Нашел "Настройки - Настройки редактора" - Вкладка "Цвет" и Variable. К сожалению, IBExpert не отличает входной и выходной параметр от задекларированной переменной. Хотя то что есть уже хорошо.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40009852
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax
К сожалению, IBExpert не отличает входной и выходной параметр от задекларированной переменной.


А зачем синтаксической подсветке их различать? За 20 лет ты первый, кому это зачем-то понадобилось.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40010037
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
А зачем синтаксической подсветке их различать?

Это же очевидно - чтобы глядя на PSQL, сразу понимать, где какой параметр используется. Вот тут выборка по входному, тут присваиваем значение выходному. Когда текст процедуры достаточно большой (с десяток экранов) и не помнишь все параметры, то достаточно посмотреть на FOR SELECT и список его INTO, чтобы увидеть, что все параметры одного цвета и значит, все ОК. То же самое с условиями.
IBExpert
За 20 лет ты первый, кому это зачем-то понадобилось.

Так за 20 лет я только сейчас сам понял, что окрашивать параметры - хорошая идея, после того как ты предложил такое. Из коробки этого не было, а сам не догадался там правки вносить. Так что это не показатель.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40010058
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax
Это же очевидно - чтобы глядя на PSQL, сразу понимать, где какой параметр используется.


Чтобы это сразу понимать, нужно точно помнить, какой цвет чему соответствует.
А то ведь можно дожелаться и до того, что захочется иметь разные цвета для имен разных объектов БД.
Это, кстати, гораздо проще реализовать: парсить PSQL на каждый чих для этого не нужно.

CyberMax

Вот тут выборка по входному, тут присваиваем значение выходному. Когда текст процедуры достаточно большой (с десяток экранов) и не помнишь все параметры, то достаточно посмотреть на FOR SELECT и список его INTO, чтобы увидеть, что все параметры одного цвета и значит, все ОК. То же самое с условиями.


В PSQL читать и писать можно любые параметры/переменные, в любой комбинации.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40010060
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Чтобы это сразу понимать, нужно точно помнить, какой цвет чему соответствует.

Верно. Поэтому в IBExpert'е есть настройка цвета для разных типов элементов и пользователь сам настраивает тот цвет, который ему удобен для понимания.
IBExpert
А то ведь можно дожелаться и до того, что захочется иметь разные цвета для имен разных объектов БД.

А что, разве плохое желание? Другое дело, что практического смысла в этом мало. Потому что не получится соединить таблицу с доменом, сделать выборку из функции или выполнить триггер. Хотя вот визуально отличить таблицу от представления или от процедуры без параметров - мысль интересная.

IBExpert
В PSQL читать и писать можно любые параметры/переменные, в любой комбинации.

Да, именно в этом и засада. Поэтому легко опечататься и указать не то, что хотел. Собственно, для этого IDE и предназначена - упростить труд пользователя и помочь ему избежать очевидных или легко выявляемых ошибок.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40010065
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax

А что, разве плохое желание? Другое дело, что практического смысла в этом мало.


Именно. Но совсем не потому, что соединить таблицу с доменом не получится.
А потому что вырвиглазная схема с кучей цветов больше мешает, чем помогает.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40010067
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
А потому что вырвиглазная схема с кучей цветов больше мешает, чем помогает.

А это вкусовщина.

Вот, например:


SYS$LINK$MS - это ХП или таблица или представление? Конечно, я узнаю, что это, просто глядя на имя - ведь есть конвенция именования объектов. Но ее иногда приходится нарушать или это Legacy-объект, который сейчас никак не переименовать. А если это новый сотрудник смотрит? Ему надо лезть в объект, смотреть, что это.
А DATE_BEGIN - это переменная или входной параметр? Тоже надо лезть в декларацию, а это двумя экранами выше или кликать на параметре и смотреть подсказку.

Если будет возможность выделить цветом таблицы, пакеты, PSQL-функции, UDF (их особенно), я буду первый, кто это сделает.
...
Рейтинг: 0 / 0
Вопрос по двойственности (теоретический)
    #40010143
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CyberMax
А DATE_BEGIN - это переменная или входной параметр?
Мне лично - без разницы, ведь переменные и входные параметры несут одинаковую смысловую нагрузку. Одинаково используются в фильтрах запросов, например.

Я иногда даже меняю входные параметры - использую их как переменные. Правда, редко. Но почему нет.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по двойственности (теоретический)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]