powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Сломалось заполнение параметров в запросе
25 сообщений из 37, страница 1 из 2
Сломалось заполнение параметров в запросе
    #39978839
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!

Просьба разъяснить, то ли что-то пропустил, то ли в настройки куда-то вынесли, но если есть в запросе такая конструкция
Код: plsql
1.
where (field = :PARAM) or (:PARAM IS NULL)


То при выполнении запроса не дает возможности прописать параметр. В колонке Type пишет NULL/NOT NULL, А в колонке Value контрола, куда заносить значение параметра, ничего нет, просто серое поле :(
Раньше конечно же работало, откатился вплоть до версии 2019.10.24.1 но не работает все равно. Поэтому и спрашиваю, может что-то в настройках, на первый взгляд не нашел.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978846
demon1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделай каст параметра к нужному типу и все
Код: sql
1.
where (field = :PARAM) or (cast(:PARAM as fld_src) IS NULL)
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978851
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
demon1992
Сделай каст параметра к нужному типу

Спасибо, это конечно как временное решение потянет, но не понимаю зачем было ломать, то что раньше работало. Да и не совсем логично, тип параметра определяется из типа поля, имя параметра то же самое. Не понимаю.
В тройке точно не нужно кастовать параметр если он определяет по типу поля в запросе. Это какой-то "волюнтаризм" :))
По крайне мере в стандарте SQL, по моему, такого требования нету.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978867
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko
не понимаю зачем было ломать, то что раньше работало.


Из вредности, разумеется. Ты уверен, что оно раньше работало? Я вот не уверен.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978869
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko

В тройке точно не нужно кастовать параметр если он определяет по типу поля в запросе.


И каков тип второго параметра в твоем запросе?
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978873
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert

И каков тип второго параметра в твоем запросе?

Такой же как и первого и единственного (см имя параметра, они одинаковые), по типу поля.
Ты же "два параметра" схлопываешь в один, так зачем огород городить?
Саша, раньше таких заморочек не было и прекрасно все работало годами . Где в стандарте написано что в таком случае обязательно нужно кастовать параметр?
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978884
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko
IBExpert

И каков тип второго параметра в твоем запросе?

Такой же как и первого и единственного (см имя параметра, они одинаковые), по типу поля.


Это у тебя он единственный. А для сервера их два, и второй параметр имеет тип, отличный от первого параметра.
Обзови свои параметры по-разному и полюбуйся на результат.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978905
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert

Это у тебя он единственный. А для сервера их два

Саша, я это прекрасно знаю. ))
Ты не обратил внимание на Maxim Kovalenko "два параметра" схлопываешь в один
Ну если ты их по имени схлопываешь в один - ну подставь тип по полю, делов то. А самое главное, так работало годами и десятилетиями , если один и то же параметр, например код чего угодно, в каком-нибудь многоэтажном запросе присутствует много раз, мы по имени параметра его присваиваем один раз , а не 10. Ну давай будем логичны. В конце концов, если мы где-то накосячим, так пусть нам об это скажет сам сервер. Ты же почему-то за нас и за стандарт SQL( ибо ссылки на стандарт где бы это требовалось так и нету) решил что параметр обязательно нужно кастовать. Причем это нужно только для отладки , а сервер прекрасно это выполняет и без каста . Это хорошо если такой параметр в запросе один, а если это какой-то рабочий запрос из продакшена, где такой параметр может встречаться сильно больше одного раза?
Ну мы все твой продукт любим именно за дружественный и не перегруженный интрефейс и за гуманное отношение к нам) Ну так зачем осложнять нам жисть. Ну требовать он нас того, чего нету в стандарте - ну совсем не гуманно.
Я понимаю если бы всегда именно так и было (с кастованием) типа хорошо не жили, нефига и начинать :)
Но тут то, все великолепно работало, и на тебе. Наше же главное правило - "работает - не лезь" :))
Ну давай вернем как и былО?
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39978967
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko

Код: plsql
1.
where (field = :PARAM) or (:PARAM IS NULL)



Решил покапать. Забавно получается. У тебя тип параметра определяется по последнему вхождению в запрос параметра определенного имени.
Т.е. такая конструкция дает возможность завести данные
Код: plsql
1.
where (:PARAM IS NULL) or (field = :PARAM)


И без всякого каста, возможно ты просто поменял порядок перечисления параметров по имени, у которого брать тип.
Раньше было по первому вхождению, теперь по последнему.
Ну конечно, можно и поменять местами, в данном случае не велика работа, хотя помню, вроде как у Влада в презентации именно такой конструкции SQL значилось как сначала <имя поля> = параметр или параметр is null. Не берусь утверждать что порядок следования как-то регламентирован в стандарте, но то как отложилось, так и использовалось. Хотя, как мне кажется, именно первоначальный вариант where (field = :PARAM) or (:PARAM IS NULL) более логичен, Т.е. сначала определили тип по имени, дальше уже все остальные вхождения параметра с таким же именем не рассматриваем, ибо тип уже известен. Да и я слабо представляю себе, что бы разные типы параметров называли одним именем, это по любому получим ошибку от сервера о несоответствии типов. Да даже один тип параметра, но разная длинна строки вызовет ошибку сервера.
Т.е. определение типа по первому вхождению параметра с определенным именем более логична.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979158
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko
А самое главное, так работало годами и десятилетиями


А ЕСЛИ ЖИРНЫМ КЭПСОМ НАПИСАТЬ, ТО И СТОЛЕТИЯМИ!

Хорош фантазировать-то. До FB 2.5 подобные запросы вообще data type unknown выдавали.
И нет, я не буду телепатически выяснять, какой из двух-трех-четырех-...-десяти типов куда подставить.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979312
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert

Хорош фантазировать-то. До FB 2.5 подобные запросы вообще data type unknown выдавали.

Саша, вообще-то про десятилетия фраза звучала так:
Maxim KovalenkoНу если ты их по имени схлопываешь в один - ну подставь тип по полю, делов то. А самое главное, так работало годами и десятилетиями
Ты же выдергиваешь из контекста. Речь шла о Maxim Kovalenkoесли один и то же параметр, например код чего угодно, в каком-нибудь многоэтажном запросе присутствует много раз, мы по имени параметра его присваиваем один раз , а не 10. Ну давай будем логичныТак что никакой фантазии по поводу десятилетий нету.
IBExpertИ нет, я не буду телепатически выяснять, какой из двух-трех-четырех-...-десяти типов куда подставить.
Не надо телепатически, все было описано предельно ясно и понятно. см мои два предпоследних сообщения. Если что-то не достаточно понятно описал, всегда готов уточнить, вообще не вопрос.
Я понял, настроения или желания вчитываться в то что тебе написали - нету. Пока одни эмоции. Ну сорри что потревожил.:)
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979322
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko
все было описано предельно ясно и понятно. см мои два предпоследних сообщения.


Фантазии там твои, в основном.
Вот как это "великолепно работало" в эксперте с FB 2.5 и выше:
https://www.sql.ru/forum/1302880/propal-parametr-zaprosa

Т.е., эксперт тупо скипал параметры с типом SQL_NULL. Больше оно так работать не будет.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979347
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert

Вот как это "великолепно работало" в эксперте с FB 2.5 и выше:

Саша, приведенный пример вообще никак не подходит для описания текущей проблемы, два разных параметра с разными именами Один __vv_0 , второй __testID_1 Естественно и обрабатываются по разному. Я же тебе говорю о другой конструкции, когда имя параметра одно, но в тексте запроса присутствует много раз (where (field = :PARAM) or (:PARAM IS NULL) это как частный случай). Ты же мне все пытаешься привести пример как обрабатывается одиночный параметр типа SQL_NULL Еще раз, у тебя все параметры, присутствующие в запросе, одного имени, сворачиваются до одного параметра, хоть их там 10 штук в тексте. Понятно что для сервера это 10 параметров, но мы то присваиваем этот параметр по имени один раз, ровно то что я тебе и писАл. И все мои объяснения относятся именно к такой ситуации.
И то что у тебя тип параметра стал определяться по последнему вхождению в запрос, а раньше определялся по первом, это я тебе то же написал. Вот тебе еще пара картинок, которые подтверждают мои слова про определения типа параметра по последнему вхождению параметра в запрос. И заметь, никакого NULL. Вот о чем я говорю.
Maxim Kovalenko
Забавно получается. У тебя тип параметра определяется по последнему вхождению в запрос параметра определенного имени.
Т.е. такая конструкция дает возможность завести данные
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979392
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko

И то что у тебя тип параметра стал определяться по последнему вхождению в запрос, а раньше определялся по первом, это я тебе то же написал. Вот тебе еще пара картинок, которые подтверждают мои слова про определения типа параметра по последнему вхождению параметра в запрос. И заметь, никакого NULL. Вот о чем я говорю.


Уфф, какой ты трудный... Если из двух параметров один игнорируется, сколько остается? Правильно, один. Он же первый, он же последний. Всегда по последнему тип определялся, ничего там не изменилось: как был цикл с первого параметра до последнего, так и остался.
Выложить тебе версию двухлетней давности, чтобы ты убедился? У меня их есть.

Так что нефиг заниматься фигней, а нужно давать параметрам разные имена в таких случаях, вот и все.

Теоретически, встретив параметр типа SQL_NULL, можно посмотреть, есть ли еще параметр с таким именем. И если есть, проигнорировать его как раньше. Тогда, по идее, должно работать "как раньше". Но фиг знает, насколько это правильно.
А, главное, кто тебе гарантирует, что где-то в другом месте, не в эксперте, оно будет работать точно так же??
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979749
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert

Уфф, какой ты трудный...


Ну, это взаимно, всегда пожалуйста:)

IBExpertВыложить тебе версию двухлетней давности, чтобы ты убедился? У меня их есть.

Ну, у меня их то же есть, поставил версию от января 2018 - там да, параметр который идет в конструкции (field = :PARAM) or (:PARAM IS NULL) назначается нормально. Теперь понятно, при схлопывании по имени, он у тебя просто игнорировался.

IBExpertТак что нефиг заниматься фигней, а нужно давать параметрам разные имена в таких случаях, вот и все.

Саша, почему ты считаешь что это фигня? Отнюдь. Я тебе больше скажу, именно твое предложение - фигня. Ибо выражение (field = :PARAM) or (:PARAM IS NULL) и делалось специально, что бы через один параметр получать либо один элемент списка или весь список. Так что тут параметр просто таки должен называться одним именем, иначе никакого выигрыша не получить.

IBExpertТеоретически, встретив параметр типа SQL_NULL, можно посмотреть, есть ли еще параметр с таким именем. И если есть, проигнорировать его как раньше. Тогда, по идее, должно работать "как раньше". Но фиг знает, насколько это правильно.

Ну вот, это ровно то, о чем я писАл несколькими постами выше. И если так сделать, то это будет как минимум логично. И наша благодарность не будет знать границ в разумных приделах :) . А то что это будет работать и без эксперта, так оно и так работает у всех кто использует такую конструкцию. Параметры то назначаются по имени, в подавляющем большинстве случаев. Так что будет работать. Собственно оно у тебя и работало в тех, старых версиях. Отлаживалось в эксперте, а потом переносилось в продакшен и прекрасно работает и по сей день. Так что пожалуйста, "не будет ли любезен многоуважаемый джин" ©Мюнхаузен именно так и реализовать работу с данной конструкцией?
Заранее спасибо!
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979841
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko

Саша, почему ты считаешь что это фигня?


А что тут непонятного?
Ты ради экономии на спичках, сам того не зная, заложился на конкретную реализацию в компонентах доступа эксперта, которая совершенно случайно выдавала нужный тебе результат, игнорируя параметры с типом SQL_NULL.
Ну вот и получил знак свыше, что так делать не надо.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979860
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert

Ты ради экономии на спичках, сам того не зная, заложился на конкретную реализацию в компонентах доступа эксперта


Еще раз, это не моя реализация, это реализация сделана в сервере и именно в том виде в котором я её приводил.

В релиз ноте к 2.5. все это описано

Поддержка нетипизированных параметров в
предикате IS NULL
Адриано дос Сантос Фернандес
Ссылка в трекере: ( CORE-2298 )
По многочисленным просьбам (в частности, от программистов, использующих Delphi) добавлена воз-
можность использовать «один и тот же» параметр как условие фильтра по полю таблицы и проверять
его (параметр) на равенство NULL. Это позволяет разработчикам клиентских приложений (использую-
щим Delphi и другие языки программирования) использовать «отключаемые фильтры» (т.е. условия с
использованием параметров, которые «отключаются» присвоением параметру NULL), т.е. использовать
запросы следующего типа: WHERE col1 = :param1 OR :param1 IS NULL и далее по тексту.

Так что ничего я не экономил, а делал согласно документации.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979936
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko

Еще раз, это не моя реализация, это реализация сделана в сервере и именно в том виде в котором я её приводил.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39979965
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
Maxim Kovalenko

Еще раз, это не моя реализация, это реализация сделана в сервере и именно в том виде в котором я её приводил.


Ну, цитата моя, и? Если придираться, то стилистически можно и получше было написать:), но суть не меняется. Такая конструкция имеет место быть, без всяких кастов и "возможностью использовать один и тот же параметр" Соответственно очень хочется поддержки в эксперте.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39980072
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Kovalenko

Ну, цитата моя, и?


И ничего. Глюкнуло что-то и отправилось само.

В сервере реализовано вот это:
WHERE col1 = ? OR ? IS NULL
и вся реализация с точки зрения приложения заключается в том, что для второго параметра сервер теперь возвращает SQL_NULL, а не посылает далеко.
Все. Остальное в приложении или прокладке между ним и сервером.

Начинать и надо было со ссылки на CORE-2298:
If the "param1" is not NULL, driver/application is required to set the correct data for the first parameter and set the XSQLVAR.sqlind to not null and leave XSQLVAR.sqldata empty/null.

If the "param2" is NULL, driver/application is required to set the XSQLVAR.sqlind of the first and second parameters to null and leave the XSQLVAR.sqldata empty/null.

Maxim Kovalenko

Так что ничего я не экономил


А зачем тогда делать через один параметр, а не через два?
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39980152
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, что встреваю.

Maxim Kovalenko

Просьба разъяснить, то ли что-то пропустил, то ли в настройки куда-то вынесли, но если есть в запросе такая конструкция
Код: plsql
1.
where (field = :PARAM) or (:PARAM IS NULL)



А чем плох вариант
Код: sql
1.
where FIELD = coalesce( :PARAM, FIELD )



Спрашиваю из чистого любопытства.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39980221
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В свежей версии проверь.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39980223
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov

А чем плох вариант


ИМХО, вариант с OR - это просто дельфевая привычка с BDE-шных времен.
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39980227
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert
В свежей версии проверь.


Во, совсем другое дело! Все работает.)))

P.S. Куда слать на пиво?))
...
Рейтинг: 0 / 0
Сломалось заполнение параметров в запросе
    #39980236
Maxim Kovalenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert

Начинать и надо было со ссылки на CORE-2298:

Ну сорри, не думал что эта конструкция не известна.

IBExpert
А зачем тогда делать через один параметр, а не через два?

Ну ровно то что релиз ноте и написано. Если я правильно понял твой вопрос.
использовать «отключаемые фильтры» (т.е. условия с
использованием параметров, которые «отключаются» присвоением параметру NULL),

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


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