powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Препроцессор/парсер SQL
33 сообщений из 33, показаны все 2 страниц
Препроцессор/парсер SQL
    #37775184
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Приходится работать с базой, логические сущности которой (справочники, поля/атрибуты, связи/ассоциации) которой описаны в словаре данных, а физически размещаются в реальных табличках/полях, доступ к которым конечному юзеру закрыт...да и программисту приходится несладко. Есть API работы со всем этим делом, и вроде бы удобный, но вот дьявольски громоздкий...:(
В общем, для простых операций "в коде" приходится делать массу однообразных движений...

Возникла идея привлечь SQL, но с использованием логических имен бизнес-объектов, типа так:

Код: sql
1.
2.
select Полное_Наименование from Справочник_Административных_Округов_Москвы
  where Краткое_Наименование = 'СВАО'



Потом распарсить запрос, получить список логических имен табличек/атрибутов, потом залезть в словарь, выполнить нужные подстановки, получить "нормальный" запрос
Код: sql
1.
select F_25 from T_88  where F_11 = 'СВАО'


и отправить его на выполнение...

Вопрос: есть ли готовые парсеры/препроцессоры SQL? Ну или что-то похожее?

Спасибо.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775206
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вьюхи/синонимы не проще использовать?
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775207
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДВопрос: есть ли готовые парсеры/препроцессоры SQL? Ну или что-то похожее?

1C
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775211
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovчччДВопрос: есть ли готовые парсеры/препроцессоры SQL? Ну или что-то похожее?

1C

А что оттуда можно взять?
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775257
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДА что оттуда можно взять?
Фффсё! И главное - понимание, что так делать не надо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775425
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДDimitry Sibiryakovпропущено...

1C

А что оттуда можно взять?1С именно так и делает, запрос типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ВЫБРАТЬ
	(ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.Номенклатура, РезервыПоПоступлениямОстатки.Номенклатура)).Артикул КАК Артикул,
	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.Номенклатура, РезервыПоПоступлениямОстатки.Номенклатура) КАК Номенклатура,
	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.ДокументРезерва, РезервыПоПоступлениямОстатки.Заказ) КАК Заказ,
	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК Резерв,
	ЕСТЬNULL(РезервыПоПоступлениямОстатки.КоличествоОстаток, 0) КАК ПоКонтейнеру,
	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(РезервыПоПоступлениямОстатки.КоличествоОстаток, 0) КАК Разница
ИЗ
	РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыВРезервеНаСкладахОстатки
		ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.РезервыПоПоступлениям.Остатки(, Склад = &Склад) КАК РезервыПоПоступлениямОстатки
		ПО ТоварыВРезервеНаСкладахОстатки.Номенклатура = РезервыПоПоступлениямОстатки.Номенклатура
			И ТоварыВРезервеНаСкладахОстатки.Склад = РезервыПоПоступлениямОстатки.Склад
			И ТоварыВРезервеНаСкладахОстатки.ДокументРезерва = РезервыПоПоступлениямОстатки.Заказ
ГДЕ
	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(РезервыПоПоступлениямОстатки.КоличествоОстаток, 0) <> 0

УПОРЯДОЧИТЬ ПО
	Артикул,
	Заказ

превращается в нормальный SQL, правда имена таблиц и полей там что-то типа Ref1523
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775529
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naf, 1С - это немеряно круто! :)

Идея понятна, меня интересует реализация механизма. Готовые парсеры, бесплатные и с открытым кодом.
...
...хорошо бы комбинировать "обычный" SQL, с физическими именами объектов, и "расширенный", с логическими. Ибо есть таблички постоянные, не зависящие от конкретной конфигурации.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775558
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД Есть API работы со всем этим делом, и вроде бы удобный, но вот дьявольски громоздкий...:(
В общем, для простых операций "в коде" приходится делать массу однообразных движений...

Видел, как на основе словаря и апи системы автогенерился слой вьюх. и пакетов доступа к данным. На оракле-PL/SQL отлично работало. то был оебс с гибкими полями, которые могли быть кастомизированы по разному на разных проектах.....
чччДдоступ к которым конечному юзеру закрыт
что нельзя - понятно, а что можно? во что должен оттранслироваться псевдо-скуэльный код?
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775563
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select Полное_Наименование from Справочник_Административных_Округов_Москвы
where Краткое_Наименование = 'СВАО'

и какой уроверь сервиса должна обеспечить система трансляции? Система, в которой юзверь редактирует запрос?
набрано - по ошибке
Краткое_Наименовнаие. - описался разработчик. Что должен сказать парсер? Среды разработки дают столько автоподсказок, дополнений, шаблонов....
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775592
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakovselect Полное_Наименование from Справочник_Административных_Округов_Москвы
where Краткое_Наименование = 'СВАО'

и какой уроверь сервиса должна обеспечить система трансляции? Система, в которой юзверь редактирует запрос?
набрано - по ошибке
Краткое_Наименовнаие. - описался разработчик. Что должен сказать парсер? Среды разработки дают столько автоподсказок, дополнений, шаблонов....
Да всего-навсего обеспечить сборку-разборку SQL предложения.
На выходе программист должен получить список кляуз предложения (From, where, order by...), в них, в зависимости от части предложения - список табличек (из предложений From, Join...) и список полей, к ним относящихся. ...структура такая, в виде деревца, значитЪ...

Программист пробежавшись по структуре, сам проверит (по словарю) правильные ли там имена. И выполнит замену имени таблички / поля (или, к примеру, добавить новое) на значение из словаря.
А потом - бэмц - из структуры - обратно в текст. И на выполнение.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775596
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая разница помнить названия таблиц, полей или их синонимов? Если названия говорящие, то проблемы нет, если конечно Table123, то да - но лучше наименования изменить
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775617
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NafКакая разница помнить названия таблиц, полей или их синонимов? Если названия говорящие, то проблемы нет, если конечно Table123, то да - но лучше наименования изменить
Щито? :)
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775619
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот было бы хорошо, если бы предусматривалась возможность писать "через точку" как в Си++ к примеру:
Код: sql
1.
2.
select Contract.Company.FullName
from Sales

что раскрывалось бы в:
Код: sql
1.
2.
3.
4.
select Companies.FullName
from Sales
left join Contracts on Sales.Contract=Contracts.ID
left join Companies on Contracts.Company=Companies.ID
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775624
igorekk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В АБС Diasoft 5NT есть свой препроцессор и набор макросов в include-файле.

Например,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#define M_LOG_PROC_PARAM(_ProcParamName, _ProcParamType) \
if @__TraceProcParam <> 0 \
begin \
  if _ProcParamName is null \
    select @__TraceOneVar = '_ProcParamName = NULL' \
  else \
    select @__TraceOneVar = '_ProcParamName = ' + convert(varchar(1000), _ProcParamName) \
  while charindex('%', @__TraceOneVar) > 0 select @__TraceOneVar = stuff(@__TraceOneVar, charindex('%', @__TraceOneVar), 1, '*') \
  if Len(@__TraceVars) + Len(@__TraceOneVar) > 2000 \
  begin \
    print @__TraceVars \
    select @__TraceVars = 'Trace.Server.Proc ' + @__TraceOneVar \
  end \
  else \
    select @__TraceVars = @__TraceVars + M_LINE_BREAK + \
                          @__TraceOneVar \
end



Приятно иногда, что не надо писать кучу строк для отладки :)

И скрипты, проливаемые на базу идут в 2 шага: 1-препроцессор, 2-проливка уже на базу.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775637
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafвот было бы хорошо, если бы предусматривалась возможность писать "через точку" как в Си++ к примеру:
Код: sql
1.
2.
select Contract.Company.FullName
from Sales

что раскрывалось бы в:
Код: sql
1.
2.
3.
4.
select Companies.FullName
from Sales
left join Contracts on Sales.Contract=Contracts.ID
left join Companies on Contracts.Company=Companies.ID


+1.
Нет, +3 даже! :)

...я вот тоже еще не уверен в конечном синтаксисе, но чувствую, что должен существовать парсер, который умеет разбирать все это, и который бы настраивался под желания моей левой пятки. Осталось только его найти (или сделать).
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775666
igorekk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД, ORM? :)
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775677
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igorekkчччД, ORM? :)
Да какое там "О", R-R-M, скорее уж.
За#@ался я, короче. Там, где в итоге требуется одна строчка SQL, приходится туеву хучу апишный вызовов громоздить. Ну или расширять апи под каждый чих.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775688
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и все таки - какой сервер БД? можно ли делать вьюшки в нем? есть ли там язык ХП, и что может?
За что я не люблю препроцессоры
пусть из запроса
селект имя_ученика из класс_10_б где уши_оттопырены

родился запрос:
select a1 from a2 where a3='zz'
который при исполнении породил ошибку
"Поле a3 имеет не тот тип".

Что должен сделать "Универсальный парсер"?
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775702
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igorekkВ АБС Diasoft 5NT есть свой препроцессор и набор макросов в include-файле.

Например,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#define M_LOG_PROC_PARAM(_ProcParamName, _ProcParamType) \
if @__TraceProcParam <> 0 \
begin \
  if _ProcParamName is null \
    select @__TraceOneVar = '_ProcParamName = NULL' \
  else \
    select @__TraceOneVar = '_ProcParamName = ' + convert(varchar(1000), _ProcParamName) \
  while charindex('%', @__TraceOneVar) > 0 select @__TraceOneVar = stuff(@__TraceOneVar, charindex('%', @__TraceOneVar), 1, '*') \
  if Len(@__TraceVars) + Len(@__TraceOneVar) > 2000 \
  begin \
    print @__TraceVars \
    select @__TraceVars = 'Trace.Server.Proc ' + @__TraceOneVar \
  end \
  else \
    select @__TraceVars = @__TraceVars + M_LINE_BREAK + \
                          @__TraceOneVar \
end



Приятно иногда, что не надо писать кучу строк для отладки :)

И скрипты, проливаемые на базу идут в 2 шага: 1-препроцессор, 2-проливка уже на базу.

Парсер ищет/заменяет слова, начинающиеся с "@__"?
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775719
igorekk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД, нет.

Он просто заменяет вызов M_LOG_PROC_PARAM(@DealID, DSIDENTIFIER) на всю ту простыню, которая со следующей строчки после #define.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775863
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775883
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь - примеры применения m4 для генерации SQL
http://lib.custis.ru/M4
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775895
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov, спасибо, конечно, но мне нужно парсить готовые SQL - предложения, в нужные структуры. В первую очередь. Во вторую - модифицировать структуры по различным правилам. В третью - генерировать из них текст конечного SQL - предложения.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37775935
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДVladimir Baskakov, спасибо, конечно, но мне нужно парсить готовые SQL - предложения, в нужные структуры. В первую очередь. Во вторую - модифицировать структуры по различным правилам. В третью - генерировать из них текст конечного SQL - предложения.Нереально. Можно ещё найти парсер для стандартного SQL, но для конкретной СУБД не найдёте.

Только если написать самому и потом выложить для бесплатного пользования.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37776020
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД ,
1) нужно парсить готовые SQL - предложения, в нужные структуры.
2) - модифицировать структуры по различным правилам.
3) - генерировать из них текст конечного SQL - предложения.
рефал в помощь.... или синтаксический анализатор, сгенеренный лексо-джассом.

или..... кастомизируемый текстовый редактор , который сразу или по запросу автоподставляет в текст чего надо, превращая сырец в SQL-комментарий.
гыыыы..... познайте бесконечное могущество вимо-имаксов.... гы еще раз.
Без гы - сцинте, notepad++. jedit. Разработчикам (отчетов) станет легче!

(задумчиво) выдрать из SQLite парсер и допилить? - дорого, и ненадежно. Не надо. Кто это сможет - не задаст такой вопрос... хотя)))) - всяко бывает.... ))))
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37777521
serg99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafвот было бы хорошо, если бы предусматривалась возможность писать "через точку" как в Си++ к примеру:
Код: sql
1.
2.
select Contract.Company.FullName
from Sales

что раскрывалось бы в:
Код: sql
1.
2.
3.
4.
select Companies.FullName
from Sales
left join Contracts on Sales.Contract=Contracts.ID
left join Companies on Contracts.Company=Companies.ID


Еще лучше если бы можно было написать

Sales.Contract.Company.FullName

Собственно мы СУБД именно с такими возможностями делаем.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37778470
vvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Сахарок"...:)
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37778522
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serg99Nafвот было бы хорошо, если бы предусматривалась возможность писать "через точку" как в Си++ к примеру:
Код: sql
1.
2.
select Contract.Company.FullName
from Sales

что раскрывалось бы в:
Код: sql
1.
2.
3.
4.
select Companies.FullName
from Sales
left join Contracts on Sales.Contract=Contracts.ID
left join Companies on Contracts.Company=Companies.ID


Еще лучше если бы можно было написать

Sales.Contract.Company.FullName

Собственно мы СУБД именно с такими возможностями делаем.
Не лучше.
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37779732
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafвот было бы хорошо, если бы предусматривалась возможность писать "через точку" как в Си++ к примеру:
Код: sql
1.
2.
select Contract.Company.FullName
from Sales

что раскрывалось бы в:
Код: sql
1.
2.
3.
4.
select Companies.FullName
from Sales
left join Contracts on Sales.Contract=Contracts.ID
left join Companies on Contracts.Company=Companies.ID



Примеры запросов из рабочего прототипа такого "парсера"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SELECT  
  #gm.DocNo,  
  #gm.PostingDate,  
  #gm.Comment, 
  #gm.Contractor.Name,  
  #gm.Items.Art,  
  #gm.Items.Pieces,  
  #g.PricePL 
FROM  
GOODSMOVEMENTS #gm JOIN GOODS #g ON #gm.Items.Art = #g.Art;

SELECT  
  #gm.DocNo,  
  #gm.PostingDate,  
  #gm.Contractor.Name, 
  #gm.Items.Art, 
  #gm.Items.Pieces  
FROM GOODSMOVEMENTS  #gm 
WHERE #gm.Items.Art LIKE "Hat%" 

SELECT 
  #gt.DocN,
  #gt.Cntr.Name,
  #gt.Cntr.Bank.Name
FROM GOODS[.Art LIKE "T%"].Turnover #gt;



если интересно, читать здесь
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37781450
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37781506
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-geneесли интересно, читать здесь
интересно, уже ранее ознакомился )) спасибо
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37781510
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... *смотрит, бурча под нос* ну что ж вы все классы в таблицы запихнуть пытаетесь?
...
Рейтинг: 0 / 0
Препроцессор/парсер SQL
    #37782628
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В хелпе микрософта для всего T-SQL есть такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
[ WITH <common_table_expression> [ ,...n ] ]
DELETE 
    [ TOP ( expression ) [ PERCENT ] ] 
    [ FROM ] 
    { <object> | rowset_function_limited 
      [ WITH ( <table_hint_limited> [ ...n ] ) ]
    }
    [ <OUTPUT Clause> ]
    [ FROM <table_source> [ ,...n ] ] 
    [ WHERE { <search_condition> 
            | { [ CURRENT OF 
                   { { [ GLOBAL ] cursor_name } 
                       | cursor_variable_name 
                   } 
                ]
              }
            } 
    ] 
    [ OPTION ( <Query Hint> [ ,...n ] ) ] 
[; ]

<object> ::=
{ 
    [ server_name.database_name.schema_name. 
      | database_name. [ schema_name ] . 
      | schema_name.
    ]
    table_or_view_name 
}



Осталось только выдрать и парсер/генератор натравить. Может кто-то сделал уже ...
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Препроцессор/парсер SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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