|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
Я тут в очередной раз наткнулся на очень неприятную ситуацию с параметром и полем. Поэтому хочу переговорить в первую очередь с разработчиками FB о ней. 1. Есть таблица, в ней поле, к примеру, ID. Код: sql 1. 2. 3. 4. 5. 6.
2. Есть ХП, которая получает данные из неё. Код: sql 1. 2. 3. 4. 5. 6. 7.
Это абсолютно корректная ХП, которая делает то, что надо. Но, если немного ошибиться, и забыть указать двоеточие у параметра 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"? Или как вариант запретить ссылаться на поле без указания альяса, если у таблицы есть альяс. Я понимаю, что здесь больше про человеческий фактор, но тем не менее. Я напишу Хвастунову, чтобы он добавил такую проверку в парсере, но не факт, что он будет такое делать. В любом случае, хотелось бы видеть такое непосредственно в сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 09:24 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax Я напишу Хвастунову, чтобы он добавил такую проверку в парсере, но не факт, что он будет такое делать. Точно не будет, я только что у него спросил. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 09:29 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
FIELD=FIELD - нормальное условие, как и1=1. Кроме того вполне возможно условие FIELD1=FIELD2. И с параметрами так же можно перепутать. Не знаю, чего тут бояться. Я наоборот в последнее время полюбил делать параметры такие, как поля - не ошибешься, и копипаст быстрее и удобнее. Пишешь поле=:поле, да и всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:02 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
Кстати, я использовал и использую FIELD=FIELD, как раз в процедуре. Чтобы триггера сработали, обновляю все записи выборки. Правда, в SET, а не в WHERE, но всё же. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:04 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax, видимо, надо менять стиль написания кода? В частности, именования параметров. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:10 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
YuRock FIELD=FIELD - нормальное условие, как и1=1. Ты не понял. Речь про то, что FIELD может оказаться как полем таблицы, так и параметром. Если нет параметра с именем FIELD (выходного или входного) - считаем, что все ОК. YuRock Кроме того вполне возможно условие FIELD1=FIELD2. И с параметрами так же можно перепутать. См. предыдущий ответ. YuRock Я наоборот в последнее время полюбил делать параметры такие, как поля - не ошибешься, и копипаст быстрее и удобнее. Пишешь поле=:поле, да и всё. Собственно, так и делаю. Но стоит пропустить двоеточие перед именем параметра и не увидеть этого... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:12 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
kdv видимо, надо менять стиль написания кода? В частности, именования параметров. Возможно. Если другие разрабы поделятся, как у них это сделано и почему именно так, подумаю над этим. Давным-давно я пробовал вырвиглазные конструкции с префиксами типа "IN_", "OUT_", "V_", "VAR_" и т.д, но это оказалось жутко неудобно как в части написания кода, так и работы с такими ХП. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:17 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
Кстати, в EXECUTE BLOCK сделана поддержка связывания имен. Код: sql 1. 2. 3. 4. 5. 6.
Снаружи для все это параметр ID, а внутри - имя такое, какое надо. В случае ХП такого нету. Поэтому если объявлять вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
то выборка получается через "SELECT OUT_ID FROM TEST_SP(1)". Написать вот так, к сожалению, нельзя: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:29 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax, я не использую префикс : для переменных вне запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:37 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax Возможно. Если другие разрабы поделятся, как у них это сделано и почему именно так, подумаю над этим. Давным-давно я пробовал вырвиглазные конструкции с префиксами типа "IN_", "OUT_", "V_", "VAR_" и т.д, но это оказалось жутко неудобно как в части написания кода, так и работы с такими ХП. Можно просто всегда использовать параметры/переменные с двоеточием. И в редакторе того же эксперта раскрасить их в свой цвет. Бонусом code insight после двоеточия будет вываливать только параметры/переменные, а не все подряд. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:37 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
Симонов Денис я не использую префикс : для переменных вне запросов. Предлагаемое ограничение никак на этом не отразится. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:48 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
IBExpert Можно просто всегда использовать параметры/переменные с двоеточием. Я так и делаю, кроме случаев, когда параметр в левой части - привычка с до-FB3 времен. Но в новых ХП/пакетах или при редактировании старых, если не лень, добавляю. IBExpert И в редакторе того же эксперта раскрасить их в свой цвет. Отличный вариант. Суть в том, что глаз замыливается и не всегда удается заметить, что где-то не хватает двоеточия или наоборот, оно не нужно. Если параметр будет окрашен в другой цвет (а в идеале разный цвет для входных, выходных и переменных), то отсутствие двоеточия будет сразу видно. IBExpert Бонусом code insight после двоеточия будет вываливать только параметры/переменные, а не все подряд. Так там и сейчас только переменные. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:54 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax Если параметр будет окрашен в другой цвет Ну так раскрась. Эксперт это с незапамятных времен умеет. CyberMax IBExpert Бонусом code insight после двоеточия будет вываливать только параметры/переменные, а не все подряд. Так там и сейчас только переменные. Ctrl+Space вывалит все, если нет двоеточия. А специальный шорткат для переменных я и не помню даже. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 11:04 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax Ты не понял. Речь про то, что FIELD может оказаться как полем таблицы, так и параметром. Если нет параметра с именем FIELD (выходного или входного) - считаем, что все ОК. И если параметр есть и используется в другом месте - то тоже должно быть всё нормально. IN_ и OUT_ я раньше добавлял, потом забил. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 11:21 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
IBExpert Ну так раскрась. Эксперт это с незапамятных времен умеет. Спасибо. Нашел "Настройки - Настройки редактора" - Вкладка "Цвет" и Variable. К сожалению, IBExpert не отличает входной и выходной параметр от задекларированной переменной. Хотя то что есть уже хорошо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 12:07 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax К сожалению, IBExpert не отличает входной и выходной параметр от задекларированной переменной. А зачем синтаксической подсветке их различать? За 20 лет ты первый, кому это зачем-то понадобилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:46 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
IBExpert А зачем синтаксической подсветке их различать? Это же очевидно - чтобы глядя на PSQL, сразу понимать, где какой параметр используется. Вот тут выборка по входному, тут присваиваем значение выходному. Когда текст процедуры достаточно большой (с десяток экранов) и не помнишь все параметры, то достаточно посмотреть на FOR SELECT и список его INTO, чтобы увидеть, что все параметры одного цвета и значит, все ОК. То же самое с условиями. IBExpert За 20 лет ты первый, кому это зачем-то понадобилось. Так за 20 лет я только сейчас сам понял, что окрашивать параметры - хорошая идея, после того как ты предложил такое. Из коробки этого не было, а сам не догадался там правки вносить. Так что это не показатель. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 02:06 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax Это же очевидно - чтобы глядя на PSQL, сразу понимать, где какой параметр используется. Чтобы это сразу понимать, нужно точно помнить, какой цвет чему соответствует. А то ведь можно дожелаться и до того, что захочется иметь разные цвета для имен разных объектов БД. Это, кстати, гораздо проще реализовать: парсить PSQL на каждый чих для этого не нужно. CyberMax Вот тут выборка по входному, тут присваиваем значение выходному. Когда текст процедуры достаточно большой (с десяток экранов) и не помнишь все параметры, то достаточно посмотреть на FOR SELECT и список его INTO, чтобы увидеть, что все параметры одного цвета и значит, все ОК. То же самое с условиями. В PSQL читать и писать можно любые параметры/переменные, в любой комбинации. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 05:27 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
IBExpert Чтобы это сразу понимать, нужно точно помнить, какой цвет чему соответствует. Верно. Поэтому в IBExpert'е есть настройка цвета для разных типов элементов и пользователь сам настраивает тот цвет, который ему удобен для понимания. IBExpert А то ведь можно дожелаться и до того, что захочется иметь разные цвета для имен разных объектов БД. А что, разве плохое желание? Другое дело, что практического смысла в этом мало. Потому что не получится соединить таблицу с доменом, сделать выборку из функции или выполнить триггер. Хотя вот визуально отличить таблицу от представления или от процедуры без параметров - мысль интересная. IBExpert В PSQL читать и писать можно любые параметры/переменные, в любой комбинации. Да, именно в этом и засада. Поэтому легко опечататься и указать не то, что хотел. Собственно, для этого IDE и предназначена - упростить труд пользователя и помочь ему избежать очевидных или легко выявляемых ошибок. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 06:07 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax А что, разве плохое желание? Другое дело, что практического смысла в этом мало. Именно. Но совсем не потому, что соединить таблицу с доменом не получится. А потому что вырвиглазная схема с кучей цветов больше мешает, чем помогает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 07:23 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
IBExpert А потому что вырвиглазная схема с кучей цветов больше мешает, чем помогает. А это вкусовщина. Вот, например: SYS$LINK$MS - это ХП или таблица или представление? Конечно, я узнаю, что это, просто глядя на имя - ведь есть конвенция именования объектов. Но ее иногда приходится нарушать или это Legacy-объект, который сейчас никак не переименовать. А если это новый сотрудник смотрит? Ему надо лезть в объект, смотреть, что это. А DATE_BEGIN - это переменная или входной параметр? Тоже надо лезть в декларацию, а это двумя экранами выше или кликать на параметре и смотреть подсказку. Если будет возможность выделить цветом таблицы, пакеты, PSQL-функции, UDF (их особенно), я буду первый, кто это сделает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 08:10 |
|
Вопрос по двойственности (теоретический)
|
|||
---|---|---|---|
#18+
CyberMax А DATE_BEGIN - это переменная или входной параметр? Я иногда даже меняю входные параметры - использую их как переменные. Правда, редко. Но почему нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 13:17 |
|
|
start [/forum/topic.php?fid=40&fpage=11&tid=1560220]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 188ms |
0 / 0 |