Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Dependence (зависимости) и execute statement / 25 сообщений из 30, страница 1 из 2
27.05.2014, 13:56:00
    #38653262
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Доброе время суток,
FB 2.5
при использовании execute statement теряются зависимости для таблиц и полей учавствующих в этой execute statement (напр. IB Expert в Dependence конкретной таблицы уже не покажет процедуру с этой таблицей если запрос спрятан в execute statement).
Как выкручиваться в подобной ситуации? возможно кто то уже отработал методику создания такой зависимости искуственно или зависимость можно указать в ручную?
Хочется и execute statement и не потерять зависимости.

Спасибо
...
Рейтинг: 0 / 0
27.05.2014, 13:59:02
    #38653271
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail TchervonenkoКак выкручиваться в подобной ситуации?
Не использовать execute statement.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2014, 13:59:10
    #38653272
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenko,

то что теряются зависимости в execute statement это нормально ибо он на вход принимает строку. Ты можешь там вообще запрос динамически сформировать.

Mikhail Tchervonenkoвозможно кто то уже отработал методику создания такой зависимости искуственно или зависимость можно указать в ручную?

думаю ты первый с таким вопросом
...
Рейтинг: 0 / 0
27.05.2014, 14:00:17
    #38653274
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Симонов Денис,
хочется порядка в базе
...
Рейтинг: 0 / 0
27.05.2014, 14:00:49
    #38653276
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Dimitry Sibiryakov,

отказаться от execute statement не всегда возможно
...
Рейтинг: 0 / 0
27.05.2014, 14:11:52
    #38653300
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenkoотказаться от execute statement не всегда возможно
В случаях когда его зависимости известны - всегда. Приведи пример когда это невозможно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2014, 14:41:25
    #38653348
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Dimitry Sibiryakov,

обычный процедура с запросом условие сортировки которого заранее не известно, слишком много комбинаций что бы обойтись без execute statement. Можно конечно сортировать локально (Delphi XE2 + IBDAC 4.6.15) но тогда надо грузить все данные на клиент что медленно и не приемлемо (сейчас подргузка происходит порциями по мере необходимости).
...
Рейтинг: 0 / 0
27.05.2014, 14:46:45
    #38653359
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenko,

динамическое формирование кода, и execute statement в том числе - всегда зло. И зависимости тут никак не отследить. ФБ не будет парсить содержимое ES на этапе компиляции процедуры, триггера или EB с этим ES. Внутри может быть вообще неисполняемая фигня написана.

читай в самом конце, Caveats with EXECUTE STATEMENT
http://www.firebirdsql.org/refdocs/langrefupd25-psql-execstat.html

там написано практически все, что тебе уже тут ответили.
...
Рейтинг: 0 / 0
27.05.2014, 14:50:22
    #38653364
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenkoобычный процедура с запросом условие сортировки которого
заранее не известно, слишком много комбинаций что бы обойтись без execute statement
Но можно обойтись без процедуры. Или сортировать её result set.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.05.2014, 14:52:42
    #38653369
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
kdv,

то что там написано я уже читал, как и то что тут сказали мне известно. Вопрос состоял в том как не ухудшая производительность подобную зависимость добавить в процедуру не отказываясь от execute statement. Это может быть просто запрос с участием той же таблицы который ничего не возвращает или нечто подобное что создаст зависимость.
...
Рейтинг: 0 / 0
27.05.2014, 15:02:01
    #38653395
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail TchervonenkoВопрос состоял в том как не ухудшая производительность подобную зависимость добавить в процедуру не отказываясь от execute statement. Это может быть просто запрос с участием той же таблицы который ничего не возвращает или нечто подобное что создаст зависимость.
с ничего не возвращающим запросом проблема, нет таких, результат придется куда-то запихивать, пусть он и не нужен.
А так - да, а какие еще варианты? Ну какие? :-)

- dependencies создаются при компиляции DDL
- руками запихивать зависимости в системные таблицы нехорошо, да и результат неизвестен.
- ES "распарсить" может только разработчик.
- можно воткнуть в процедуру "имитацию зависимостей" для ES. но ее будет контролировать разработчик, глазами.

как бы, и все.
...
Рейтинг: 0 / 0
27.05.2014, 15:14:06
    #38653431
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenko,

добавь такой гавнокод себе в процедуру будут тебе зависимости

Код: sql
1.
2.
3.
4.
5.
6.
7.
IF (1=0) THEN
BEGIN
  -- тута некая псевдодеятельность с твоими таблицами
  IF (EXISTS(SELECT * FROM T1, T2, T3)) THEN
  BEGIN
  END
END
...
Рейтинг: 0 / 0
27.05.2014, 15:23:36
    #38653451
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Dimitry SibiryakovПриведи пример когда это невозможно.

Сортировка в зависимости от условия.
Условие в Where в зависимости от условия.
В Delphi довольно часто приходится генерить sql частично динамически, с формированием нужного условия в Where.
В sql я бы это написал как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE PROCEDURE (StartDate DATE, EndDate DATE, OrderByDate BOOLEAN) RETURNS (Id INTEGER)
AS
  DECLARE Q QueryBuilder;
begin
  Q = select D.Id from Docs D where D.Processed;
  if (StartDate is not null) then
    Q.[and (D.DocDate >= :StartDate)];
  if (EndDate is not null) then
    Q.[and (D.DocDate <= :EndDate)];
  if (OrderByDate) then
    Q.[order by D.DocDate];

  for OpenQuery(Q) into :Id do
    suspend;
end
...
Рейтинг: 0 / 0
27.05.2014, 15:32:47
    #38653464
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
NickDee,

фигнёй страдаешь

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE PROCEDURE P(OrderFieldName VARCHAR(31)) RETURNS (f1 int, f2 int, f3 int)
AS
BEGIN
  FOR SELECT f1, f2, f3
        FROM T
        ORDER BY CASE :OrderFieldName
                         WHEN 'f1' THEN f1
                         WHEN 'f2' THEN f2
                         WHEN 'f3' THEN f3
                       END
        INTO :f1, :f2, :f3
   DO SUSPEND;
END
...
Рейтинг: 0 / 0
27.05.2014, 15:38:28
    #38653471
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Симонов Денис,

А теперь то же самое, но для динамического Where :)
...
Рейтинг: 0 / 0
27.05.2014, 15:44:10
    #38653484
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
NickDee,

да пожалуйста


Код: sql
1.
2.
3.
4.
5.
select D.Id 
from Docs D
where (D.DocDate >= :StartDate or :StartDate is null) and
         (D.DocDate <= :EndDate or :EndDate is null)
         
...
Рейтинг: 0 / 0
27.05.2014, 15:49:29
    #38653494
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Симонов Денис,

все бы хорошо только сортировка не по одному полю а по нескольким и порядок тоже имеет значение и соотв может меняться.
Я ж говорю, количество комбинаций слишком велико для статического запроса.
...
Рейтинг: 0 / 0
27.05.2014, 15:51:22
    #38653499
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenko,

универсальный решатель задач? Или попытка воткнуть все запросы в ХП, там где это не надо
...
Рейтинг: 0 / 0
27.05.2014, 15:58:02
    #38653515
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Симонов Денис,

да нет, как всегда, исходя из пожеланий клиентов добавлялась функциональность которая стандартными средствами не возможна.
А ля натыкать по колонкам EhDBGrid сортировку, дабы происходило все на сервере и не простым запросом а через хранимую процедуру (т.к. ввиду дурацкой структуры базы простым запросом этот грид не наполнить). Все в принципе работает и довольно быстро, но с зависимостями порядка нет.
...
Рейтинг: 0 / 0
27.05.2014, 16:02:41
    #38653527
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail TchervonenkoСимонов Денис,

да нет, как всегда, исходя из пожеланий клиентов добавлялась функциональность которая стандартными средствами не возможна.
А ля натыкать по колонкам EhDBGrid сортировку , дабы происходило все на сервере и не простым запросом а через хранимую процедуру (т.к. ввиду дурацкой структуры базы простым запросом этот грид не наполнить). Все в принципе работает и довольно быстро, но с зависимостями порядка нет.
Ну возможно поможет сортировка результата работы процедуры
ну типа
Код: sql
1.
  slect .... from XP(.....)  order by ........
...
Рейтинг: 0 / 0
27.05.2014, 16:05:58
    #38653535
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
m7mMikhail TchervonenkoСимонов Денис,

да нет, как всегда, исходя из пожеланий клиентов добавлялась функциональность которая стандартными средствами не возможна.
А ля натыкать по колонкам EhDBGrid сортировку , дабы происходило все на сервере и не простым запросом а через хранимую процедуру (т.к. ввиду дурацкой структуры базы простым запросом этот грид не наполнить). Все в принципе работает и довольно быстро, но с зависимостями порядка нет.
Ну возможно поможет сортировка результата работы процедуры
ну типа
Код: sql
1.
  slect .... from XP(.....)  order by ........


мысль хорошая,
но там ещё и фильтрация кроме сортировки, а такой запрос будет медленным ввиду отсутствия индекса
...
Рейтинг: 0 / 0
27.05.2014, 16:07:41
    #38653537
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenkom7mпропущено...

Ну возможно поможет сортировка результата работы процедуры
ну типа
Код: sql
1.
  slect .... from XP(.....)  order by ........


мысль хорошая,
но там ещё и фильтрация кроме сортировки, а такой запрос будет медленным ввиду отсутствия индекса
ну так фильтрацию оставь в процедуре
...
Рейтинг: 0 / 0
27.05.2014, 16:08:53
    #38653538
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Mikhail Tchervonenko,

вместо ХП используй EXECUTE BLOCK и формируй его содержимое на клиенте
...
Рейтинг: 0 / 0
27.05.2014, 17:05:00
    #38653639
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
Симонов ДенисNickDee,

да пожалуйста


Код: sql
1.
2.
3.
4.
select D.Id 
from Docs D
where (D.DocDate >= :StartDate or :StartDate is null) and
         (D.DocDate <= :EndDate or :EndDate is null)

Plan(Docs NATURAL)
Ну и условия могут быть нетривиальные.

В максимуме хотелось бы такого, для гибкости:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE PROCEDURE GetStatistic(UserId INTEGER) RETURNS (StartDate DATE, EndDate DATE, ProcessedCount INT64, NotProcessedCount INT64)
AS
  declare Q SelectQuery;
begin
  Q = [select count(*) from Docs where DocDate between :StartDate and :EndDate];
  if (:UserId is not null) then
    Q = Q.[and where CreatedBy = :UserId];
  for select StartDate, EndDate from DateIntervals into :StartDate, :EndDate do
  begin
    open query Q.[and where Processed = True] into :ProcessedCount;
    open query Q.[and where Processed = False] into :NotProcessedCount;
    suspend;
  end;
end


И проблема с зависимостями решается, и компилируемость остаётся, и гибкость достаточная.
...
Рейтинг: 0 / 0
27.05.2014, 17:11:12
    #38653650
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dependence (зависимости) и execute statement
NickDeePlan(Docs NATURAL)
Ну и условия могут быть нетривиальные.
в тройке это не так. Там реализован "условный план"
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Dependence (зависимости) и execute statement / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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