metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-03-17 08:02 pm

Автоматический вывод типов запросов и bind-параметров в СУБД

Я знаю, что меня читают люди, использующие всякие разнообразные СУБД.
В связи с этим у меня есть такой хитрый вопрос, связанный с использованием 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, но непонятно кто это делает - сервер, клиентская либа или компоненты доступа. И на сервер он гонит запросы плейн-текстом, т.е. запросто может оказаться что подстановка вообще делается клиентской либой в лоб, без всякого вывода типов.

А как вообще принято эти параметры заполнять и кто это делает - сервер, клиентская либа, компоненты доступа или вообще вручную по жизни?

[identity profile] zamotivator.livejournal.com 2010-03-17 08:44 pm (UTC)(link)
erlang + epgsql + postgresql + /dev/hands
dataGroups(Conn,[SortIndex,SortDir,From,To]) ->
    {ok, Types, Names, Rows} =
	dbaccess:process_query(
	  Conn,
	  "SELECT group_id as id, group_name as name, count(*) as count
           FROM object_info
           JOIN object_group on object_info.group_id = object_group.id
           GROUP BY group_id,group_name" ++ dbaccess:remote_table(SortIndex,SortDir,From,To),[]),
    {ok, data, Types, Names, Rows}.
Edited 2010-03-17 20:45 (UTC)

[identity profile] metaclass.livejournal.com 2010-03-17 08:51 pm (UTC)(link)
И таки где здесь bind-параметры?

[identity profile] zamotivator.livejournal.com 2010-03-17 09:41 pm (UTC)(link)
bind параметры тут руками (пока что) транслируются в текст запроса.
По идее, при работе с ними ничего меняться в этйо схеме не должно

[identity profile] volodymir-k.livejournal.com 2010-03-19 01:10 am (UTC)(link)
что-то непонятное говорите

bind-переменные это в просторечии параметры SQL запроса, обозначаются в тексте запроса вопросиками (?)

select name, email from customer where id = ?

А в вашем object_info где параметры?...

[identity profile] zamotivator.livejournal.com 2010-03-19 01:11 am (UTC)(link)
В этом конкретно нету.