![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я знаю, что меня читают люди, использующие всякие разнообразные СУБД.
В связи с этим у меня есть такой хитрый вопрос, связанный с использованием bind-параметров в запросах: насколько распространена среди разных серверов (а так же клиентских либ и компонентов доступа) такая фича, что при парсинге запроса он возвращает список параметров и их типы?
Дело в том, что более-менее напрямую я использую только Firebird и он после prepare возвращает информацию о используемых параметрах и их типах (когда-то в версии 1.5.х, что ли, его плющило на тему вывода типов, но давно было, вроде исправили и вообще я уже забыл что там было).
Т.е. если мы представим селект как функцию вроде select :: p0 -> p1 -> p2 -> ... -> [(f0,f1,...)] то Firebird выводит тип этой функции из текста запроса и информации о таблицах. Это невероятно удобно, т.к. позволяет использовать SQL запрос+пару таблиц с дополнительными метаданными в качестве DSL для описания достаточно большого класса отчетов, покрывающего 90% всех потребностей в опердени. Т.е я из списка параметров и таблицы типа (параметр, юзеровское имя, справочник, формат) генерю UI для ввода этих самых параметров, а из типа результата запроса дельфи автоматом заполняет всю метаинформацию для DBGrid.
Из других СУБД я использую MSSQL и Sqlite, но через ADO.NET, в котором параметры, судя по всему, принципиально не заполняются автоматически и их нужно вносить в DbCommand или SqlCommand вручную. Т.е. я не знаю, умеет ли сервер это делать вообще. Это выбешивает просто невероятно, т.к. работы становится в несколько раз больше. Я уже подумываю написать собственный парсер запросов или вообще DSL с выводом типов и генерацией SQL запросов для описания запросов/датасетов, чтобы не заниматься этой многословной хренью.
PostgreSQL заполняет bind-параметры после prepare, но непонятно кто это делает - сервер, клиентская либа или компоненты доступа. И на сервер он гонит запросы плейн-текстом, т.е. запросто может оказаться что подстановка вообще делается клиентской либой в лоб, без всякого вывода типов.
А как вообще принято эти параметры заполнять и кто это делает - сервер, клиентская либа, компоненты доступа или вообще вручную по жизни?
В связи с этим у меня есть такой хитрый вопрос, связанный с использованием bind-параметров в запросах: насколько распространена среди разных серверов (а так же клиентских либ и компонентов доступа) такая фича, что при парсинге запроса он возвращает список параметров и их типы?
Дело в том, что более-менее напрямую я использую только Firebird и он после prepare возвращает информацию о используемых параметрах и их типах (когда-то в версии 1.5.х, что ли, его плющило на тему вывода типов, но давно было, вроде исправили и вообще я уже забыл что там было).
Т.е. если мы представим селект как функцию вроде select :: p0 -> p1 -> p2 -> ... -> [(f0,f1,...)] то Firebird выводит тип этой функции из текста запроса и информации о таблицах. Это невероятно удобно, т.к. позволяет использовать SQL запрос+пару таблиц с дополнительными метаданными в качестве DSL для описания достаточно большого класса отчетов, покрывающего 90% всех потребностей в опердени. Т.е я из списка параметров и таблицы типа (параметр, юзеровское имя, справочник, формат) генерю UI для ввода этих самых параметров, а из типа результата запроса дельфи автоматом заполняет всю метаинформацию для DBGrid.
Из других СУБД я использую MSSQL и Sqlite, но через ADO.NET, в котором параметры, судя по всему, принципиально не заполняются автоматически и их нужно вносить в DbCommand или SqlCommand вручную. Т.е. я не знаю, умеет ли сервер это делать вообще. Это выбешивает просто невероятно, т.к. работы становится в несколько раз больше. Я уже подумываю написать собственный парсер запросов или вообще DSL с выводом типов и генерацией SQL запросов для описания запросов/датасетов, чтобы не заниматься этой многословной хренью.
PostgreSQL заполняет bind-параметры после prepare, но непонятно кто это делает - сервер, клиентская либа или компоненты доступа. И на сервер он гонит запросы плейн-текстом, т.е. запросто может оказаться что подстановка вообще делается клиентской либой в лоб, без всякого вывода типов.
А как вообще принято эти параметры заполнять и кто это делает - сервер, клиентская либа, компоненты доступа или вообще вручную по жизни?
no subject
Date: 2010-03-17 08:44 pm (UTC)no subject
Date: 2010-03-17 08:51 pm (UTC)no subject
Date: 2010-03-17 09:41 pm (UTC)По идее, при работе с ними ничего меняться в этйо схеме не должно
no subject
Date: 2010-03-19 01:10 am (UTC)bind-переменные это в просторечии параметры SQL запроса, обозначаются в тексте запроса вопросиками (?)
select name, email from customer where id = ?
А в вашем object_info где параметры?...
no subject
Date: 2010-03-19 01:11 am (UTC)no subject
Date: 2010-03-17 08:44 pm (UTC)2. С параметрами сложнее. В общем случае - не знаю; в postgresql есть pQdescribePrepared http://www.postgresql.org/docs/8.4/interactive/libpq-exec.html#LIBPQ-EXEC-MAIN (И кстати запросы он на чсервер отадет по разному в зависимотси от вресии протокола)
// кстати - а когда надо знать именно выведенный тип параметров ?
Кажись наоборот - ты же их (параметры) даешь всегда.
no subject
Date: 2010-03-17 08:50 pm (UTC)Я получаю в объекте, описывающем запрос, список из одного параметра с именем dept_id и типом integer. Мне этой информации уже достаточно, чтобы знать, какой гуй-элемент сгенерировать для ввода и валидации этого параметра (т.е. для себя я уже имею пригодный гуй), а если еще добавить таблицу с метаданными, где по имени параметра я найду юзер-френдли подпись к параметру, формат ввода, справочник и прочее - то оно уже и в продакшен готово.
no subject
Date: 2010-03-17 09:50 pm (UTC)(но если у тебя есть таблицв метаданных -- логично бы туда и тип вписать а не спрашиваьть у БД)
no subject
Date: 2010-03-17 10:26 pm (UTC)no subject
Date: 2010-03-17 09:01 pm (UTC)no subject
Date: 2010-03-17 09:24 pm (UTC)Точнее не опишу, действительно очень давно последний раз писал какой-либо код по эту сторону СУБД.
no subject
Date: 2010-03-17 10:27 pm (UTC)no subject
Date: 2010-03-17 10:58 pm (UTC)ЗЫ Сейчас порылся, похоже в дотнете это уже не так. Я последний раз с обычным ADO 2.8 работал.
no subject
Date: 2010-03-18 01:54 am (UTC)no subject
Date: 2010-03-18 04:43 am (UTC)возвращает, кто из них - точно не знаю, но учитывая, что для этого идёт отправка на сервер, видимо все-таки сервер.
no subject
Date: 2010-03-18 08:48 am (UTC)