powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Параметры в предложении SELECT
25 сообщений из 110, страница 4 из 5
Параметры в предложении SELECT
    #39622248
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

не.
Код: sql
1.
select :f1 as f1 from rdb$database



тип параметра не определяет. Особой разборки то нет. Я не знаю чего они тут сцепились из-за фигни.

Alex Torin,

не знаю как ты проверял но exception появляется уже на этапе prepare, а не выполнения как ты утверждаешь
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622268
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

А не правильней ситуацию отработать как в хранимке - типа "Неизвестная переменная". Хотя, что в лоб, что по лбу. Мне не понятен смысл такой конструкции. Зачем в селекте переменная, которая нигде не определена? Чисто ради спортивного интереса?
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622271
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladHommerНе нужно этого. Но многие десятки программистов, которым больше не нужно будет переписывать парсеры при выходе новой версии firebird, скажут спасибо.Какая драма ! Что-то я не встречал и десятка "пострадавших" за всё время существования EXEC BLOCK.
Это примерно лет за 14
Т.е. пострадавшие были.

Вот код из UIB:
Код: pascal
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
  function TSQLParams.Parse(const SQL: UnicodeString): UnicodeString;
  const
    Identifiers: set of AnsiChar = ['a'..'z', 'A'..'Z', '0'..'9', '_', '$'];
  var
    Src: PWideChar;
    Dest, idlen: Word;

    procedure next;
    begin
      inc(dest);
      Result[dest] := WideChar(Src^);
      inc(Src);
    end;

    procedure Skip(c: WideChar);
    begin
      repeat
        next;
        if Src^ = c then
        begin
          Next;
          Break;
        end;
      until (Src^ = #0);
    end;

    {$IFDEF FPC}
    function PrevChar(c: PWideChar): WideChar;
    begin
      dec(c);
      result := c^;
    end;
    {$ENDIF}
  begin
    Clear;
    Src := PWideChar(SQL);
    Dest := 0;
    SetLength(Result, Length(SQL));
    while true do
      case Src^ of
        // eof
        #0 :  begin
                SetLength(Result, Dest);
                Exit;
              end;
        // normal comments
        '/' : if Src[1] = '*' then
              begin
                inc(Src, 2);
                while (Src^ <> #0) do
                  if (Src^ = '*') and (Src[1] = '/') then
                  begin
                    inc(Src, 2);
                    Break;
                  end else
                    inc(Src);
              end else
                next;
        // Firebird comments -- My comment + (eol or eof)
        {.$IFDEF FB15_UP}
        '-' : if Src[1] = '-' then
              begin
                inc(Src, 2);
                while not ({$IFDEF UNICODE}(Src^ < #256) and {$ENDIF}(AnsiChar(Src^) in [#0, #13, #10])) do
                  inc(Src);
              end else
                next;
        {.$ENDIF}
        // text ''
        '''': Skip('''');
        // text ""
        '"' : Skip('"');
        // Unnamed Input
        '?' : begin
                AddField('');
                Next;
              end;
        '[' : Skip(']');
        // Named Input
        ':' : begin
                inc(dest);
                Result[dest] := '?';
                inc(Src);
                idlen := 0;
                // quoted identifiers
                if Src[idlen] = '"' then
                begin
                  inc(Src);
                  while true do
                    if {$IFDEF UNICODE}(Src[idlen] < #256) and {$ENDIF}(AnsiChar(Src[idlen]) in [#0, '"']) then
                      Break else
                      inc(idlen);
                end else
                // unquoted identifiers
                  while {$IFDEF UNICODE}(Src[idlen] < #256) and {$ENDIF}(AnsiChar(Src[idlen]) in Identifiers) do inc(idlen);
                AddField(copy(Src, 1, idlen));
                inc(Src, idlen);
                if Src^ = '"' then inc(Src);
              end;
        // skip everything when begin identifier found !
        // in procedures
        'b','B':
          begin
            if not ((dest > 0) and {$IFDEF UNICODE}(src[-1] < #256) and {$ENDIF} ({$IFDEF FPC}PrevChar(src){$ELSE}AnsiChar(src[-1]){$ENDIF}
              in Identifiers)) and (StrIComp(PWideChar(copy(Src, 0, 5)), 'begin') = 0) and
                not ({$IFDEF UNICODE}(Src[5] < #256) and{$ENDIF}(AnsiChar(Src[5]) in Identifiers)) then
                  while (Src^ <> #0) do Next else next;
          end;
        // declare should also stop param parsing, as a declare cursor statement
        // may contain variables.
        'd','D':
          begin
            if not ((dest > 0) and {$IFDEF UNICODE}(src[-1] < #256) and {$ENDIF} ({$IFDEF FPC}PrevChar(src){$ELSE}AnsiChar(src[-1]){$ENDIF}
              in Identifiers)) and (StrIComp(PWideChar(copy(Src, 0, 7)), 'declare') = 0) and
                not ({$IFDEF UNICODE} (Src[7] < #256) and {$ENDIF}(AnsiChar(Src[7]) in Identifiers)) then
                  while (Src^ <> #0) do Next else next;
          end;
      else
        next;
      end;
  end;


Обработка DECLARE там только благодаря тому, что в DECLARE могут быть курсоры.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
EXECUTE BLOCK(NAME VARCHAR(20) = :NAME1)
RETURNS(
  RNAME CHAR(31)
)AS
  DECLARE C CURSOR FOR (SELECT RDB$RELATION_NAME FROM RDB$RELATIONS where RDB$RELATION_NAME <> :NAME);
BEGIN
  OPEN C;
  FETCH C INTO :RNAME;
  WHILE (ROW_COUNT > 0) DO
  BEGIN
    SUSPEND;
    FETCH C INTO :RNAME;
  END
  CLOSE C;
END


А если в V5 захочется создать короткий алиас для DECLARE, например VAR?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
EXECUTE BLOCK(NAME VARCHAR(20) = :NAME1)
RETURNS(
  RNAME CHAR(31)
)AS
VAR
  P1 INTEGER;
  P2 INTEGER;
  P3 CURSOR FOR (SELECT RDB$RELATION_NAME FROM RDB$RELATIONS where RDB$RELATION_NAME <> :Name);
BEGIN
END


Или не захочется т.к. поломаются парсеры? :)


Ещё.
В аудите параметры естественно без имён:
Код: sql
1.
insert into RDB$RELATIONS(RDB$SYSTEM_FLAG, RDB$FIELD_ID, RDB$FORMAT) values(:SYSTEM_FLAG, :FIELD_ID, :FORMAT);


Код: plaintext
1.
2.
3.
4.
5.
6.
insert into RDB$RELATIONS(RDB$SYSTEM_FLAG, RDB$FIELD_ID, RDB$FORMAT) values(?  , ?  , ?  );


param0 = smallint, "1"
param1 = smallint, "2"
param2 = smallint, "3"

Не удобно ведь.
Мало того что библиотекам доступа нужно самим парсить sql и заменять имена на вопросики, но ещё и пользователи библиотек остаются без имён параметров в логе.
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622272
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

ты сначала топик почитай. Я же упростил его случай
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622274
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

я не понял на фига там в DECLARE лезть было, в 3.0 ещё DECLARE [PROCEDURE | FUNCTION]. Влад показывал обработку в EXECUTE STATEMENT и там всё было как-то проще
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622275
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerМало того что библиотекам доступа нужно самим парсить sql и заменять имена на вопросики,
но ещё и пользователи библиотек остаются без имён параметров в логе.

Так никто же не заставляет ни библиотеки, ни пользователей эти самые именованные параметры
использовать. Я вот в своих запросах использую неименованные параметры и никакого
дискомфорта не чувствую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622278
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerТ.е. пострадавшие были.Кавычки куда дел ?

Были те, кто делает реальную работу, а не ноет по любому поводу.
Парсеры в компронентах\оболочках были всегда - ибо именованных пар-ров в движке нет.
Соотв. чуть допилить парсер, чтобы понимал EXECUTE BLOCK и не лез за его заголовок - вообще не проблема.
Кто сам не осилил - спрашивал, да. Таких не много было.
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622281
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денися не понял на фига там в DECLARE лезть былоЯ тоже.
Конкретно для EXEC BLOCK можно останавливать парсинг сразу после AS (можно и раньше, но это чуть сложнее).
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622291
Alex Torin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIAlex Torin,

Я чего-то проспал разборку. А у Вас запрос без хранимки, без Execute Block?
Да. без того и без того. И собственно сделать через них это понятно что можно. Собственно Дмитрий еще в начале об этом и подсказывал...
А "разборка" к делу не относится)) Не обращайте внимания!
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622299
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисHommer,

я не понял на фига там в DECLARE лезть было, в 3.0 ещё DECLARE [PROCEDURE | FUNCTION]. Влад показывал обработку в EXECUTE STATEMENT и там всё было как-то проще
Не нафига, а зачем :)
Под спойлером просто пример как разработчик UIB решал вопрос с преобразованием sql с именами параметров в sql с вопросиками.
decare cursor когда появился? А что ещё появится? И парсер переделывать чтоли? Нет конечно. Нужно научиться самим работать с именами параметров. Это хорошее решение.
Появляются новые языки, появляются новые программисты, кто-то пишет либы, кто-то ими пользуется. С вопросиками просто не удобно. Их конечно нужно оставить, но и нормальный вариант реализовать тоже.
Представьте если бы в Delphi не было именованных параметров, а были бы только вопросики. Было бы скучно.
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622301
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Torinпочему тогда гоню только я?)))
Эта галлюцинация тебе привиделась - никто не утверждал, что только ты. Как и другие глюки. Вот я и говорю, что гонишь :)
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622305
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerС вопросиками просто не удобно.

Что именно с ними неудобно делать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622307
Alex Torin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисAlex Torin,

не знаю как ты проверял но exception появляется уже на этапе prepare, а не выполнения как ты утверждаешь
Я не совсем это утверждал - потому как отвечал в контексте заданного мне вопроса! Согласен что не совсем корректно сформулировал, но оппонент от меня этого и не требовал))
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622309
Alex Torin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockAlex Torinпочему тогда гоню только я?)))
Эта галлюцинация тебе привиделась - никто не утверждал, что только ты. Как и другие глюки. Вот я и говорю, что гонишь :)
Ээээ...
YuRockТы реально гонишь.
...
И что ты после этого еще ждешь под попкорн?
А это не значило что только я? ))
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622310
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Torin,

короче смирись и прими как есть. CAST к нужному типу все юзают и не жжужат
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622312
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЧто именно с ними неудобно делать?
Не то, что неудобно.
Просто кажется нелогичным один и тот же параметр сознавать одинаковым по несколько раз. Память под структуру, память под значения (одни и те же) параметра выделять и заполнять. Несколько раз.
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622313
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex TorinYuRockТы реально гонишь.
...
И что ты после этого еще ждешь под попкорн?
А это не значило что только я? ))
Даже боюсь предположить, как к такому выводу можно было прийти.
Конечно же не означало. Я, например, тоже гоню, раз с тобой такой обмен бессмысленными сообщениями произвёл :)
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622320
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladСимонов Денися не понял на фига там в DECLARE лезть былоЯ тоже.
Конкретно для EXEC BLOCK можно останавливать парсинг сразу после AS (можно и раньше, но это чуть сложнее).
А если вы добавите новую конструкцию?
Как человеку написать преобразователь имён параметров в вопросики один раз и на всё время? Мониторить изменения в языке - очень плохой вариант. Вам ведь не комфортно находиться в ситуации, когда ваши изменения в языке могут поломать кучу библиотек доступа? Ломать не захочется и придётся подстраивать язык под реалии. Пока существует эта зависимость, чем-то придётся пожертвовать когда придёт время, или библиотеками или языком. Поэтому зависимость лучше убрать. А ещё лучше добавить работу с именованными параметрами, ведь это во всех либах нужно. И аудит будет дружелюбней. Одни плюсы :)
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622326
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

ну тыж умный. Вон Job в FB добавляешь, вот и займись. Хорошо напишешь глядишь и коммит твой примут и API расширят
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622331
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerА если вы добавите новую конструкцию?Ты серьёзно считаешь, что после EXEC BLOCK не было добавлено ни одной новой конструкции ?
Давай ты сначала поймёшь - что именно нужно "парсить", как именно и в каком объёме, а уже потом будешь рассказывать про страшшшные несовместимости.
Пример с парсингом DECLARE показывает только уровень некомпетентности того, кто это писал. Ты пока что в той же обойме.
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622332
Alex Torin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockAlex Torinпропущено...

А это не значило что только я? ))
Даже боюсь предположить, как к такому выводу можно было прийти.
Конечно же не означало. Я, например, тоже гоню, раз с тобой такой обмен бессмысленными сообщениями произвёл :)
Я говорил в контексте данной темы, а не вообще! Потому как второе понятно без слов )))
Ладно - проехали.. не суть важно собственно!))
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622334
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HommerКак человеку написать преобразователь имён параметров в вопросики один раз и на всё время?

Вот поэтому и следует сразу использовать вопросики. Заодно время на написание и работу
преобразователя сэкономится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622348
Hommer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladHommerА если вы добавите новую конструкцию?Ты серьёзно считаешь, что после EXEC BLOCK не было добавлено ни одной новой конструкции ?
Давай ты сначала поймёшь - что именно нужно "парсить", как именно и в каком объёме, а уже потом будешь рассказывать про страшшшные несовместимости.
Вот сделаете вы в V5 например такую конструкцию (входные параметры: SYSTEM_FLAG и P1):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
  (select max(Res) from (
    execute block (rel_name varchar(128) = r.rdb$relation_name) returns (Res integer) as
    begin
      Res = select count(*) from Rdb$Relation_Fields where (RDB$RELATION_NAME = :rel_name) and (RDB$SYSTEM_FLAG = :SYSTEM_FLAG)
      suspend;
    end
  )),
  cast(:P1 as integer)
from rdb$relations r


или такую (параметр P и P2):
Код: sql
1.
2.
3.
4.
5.
6.
select * from
  execute block (P1 integer = :P) returns (Res integer) as
  begin
    Res = :P1 + :P2;
    suspend;
  end


а все существующие библиотеки не смогут их обрабатывать. Потому что не смогут понять какие параметры нужно преобразовывать в ?, а какие нет.

Возможно в V5 вы не захотите чтобы параметр SYSTEM_FLAG из первого примера был виден внутри EXECUTE BLOCK, а возможно захотите. Под каждый вариант свой парсер. И сейчас его не написать, придётся дождаться вашего решения.
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622349
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

не надо фантазировать всякую чушь. Такое точно делать не будут
...
Рейтинг: 0 / 0
Параметры в предложении SELECT
    #39622350
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hommer,

продолжай прикидываться, у тебя получается.
Пока опять ник менять не придётся
...
Рейтинг: 0 / 0
25 сообщений из 110, страница 4 из 5
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Параметры в предложении SELECT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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