powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Реально ли execute statement или это миф (Firebrid 2.5)
12 сообщений из 12, страница 1 из 1
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661094
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем! Здесь Doc.EXECUTESTATEMENTFB2 написано, что с помощью execute statement в firebrid можна осуществлят любые сложные запросы. Хотел проверить. Но немогу найти своего ошыбку.

Вот процедура выполняешая select из таблицы ACCTOTAL.

Код: plsql
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.
create or alter procedure ACCTOTAL_SEL (
    DATEREST type of column ACCTOTAL.DATEREST,
    KIND type of column ACCTOTAL.KIND,
    ACCID type of column ACCTOTAL.ACCID,
    SUBCONTO3 type of column ACCTOTAL.SUBCONTO3,
    SUBCONTO2 type of column ACCTOTAL.SUBCONTO2,
    SUBCONTO1 type of column ACCTOTAL.SUBCONTO1)
returns (
    ENDCT type of column ACCTOTAL.ENDCT,
    ENDDT type of column ACCTOTAL.ENDDT)
as
declare variable CMDTEXT varchar(200);
begin

  cmdtext = 'select first 1 enddt, endct from acctotal ';
  
  cmdtext = cmdtext || 'where (daterest < '||:daterest||') (accid = '||:accid||') and (kind = '||:kind||') ';

  if (:subconto1 is not null) then cmdtext = cmdtext || ' and (subconto1 = '||:subconto1||') ';
  if (:subconto2 is not null) then cmdtext = cmdtext || ' and (subconto2 = '||:subconto2||') ';
  if (:subconto3 is not null) then cmdtext = cmdtext || ' and (subconto3 = '||:subconto3||') ';

  cmdtext = cmdtext || 'order by daterest desc ';

  for execute statement cmdtext
   into :enddt, :endct
  do
   suspend;
end



И вызываю эту процедуру внутри триггерра:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR ALTER trigger acctotal_bi for acctotal
active before insert or update position 0
as
begin
  if (new.id is null) then
  begin
    new.id = gen_id(gen_acctotal_id,1);

    execute procedure acctotal_sel(new.kind,
                                   new.accid,
                                   new.subconto3,
                                   new.subconto2,
                                   new.subconto1) 
                returning_values(new.begindt, new.beginct);
  end
end



Компилятор пишет
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661104
Поручик ·· Ржевский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тут:
Код: sql
1.
cmdtext = cmdtext || 'where (daterest < '||:daterest||') (accid = '||:accid||') and (kind = '||:kind||') ';


ашипка.

не хватает AND.

ps: и мозгов.
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661113
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

А зачем вообще в этой ситуации ES?
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661117
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поручик ·· Ржевский,

Да вы молодцы! Но подлинный код у меня с 'and'. Когда сюда написал этот код, я случайно...!

Там у меня
Код: plsql
1.
  cmdtext = cmdtext || 'where (daterest < '||:daterest||') and (accid = '||:accid||') and (kind = '||:kind||') ';
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661119
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineAlimkulov,

А зачем вообще в этой ситуации ES?

Для того, что проверить и включит в запрос
Код: plsql
1.
2.
3.
  if (:subconto1 is not null) then cmdtext = cmdtext || ' and (subconto1 = '||:subconto1||') ';
  if (:subconto2 is not null) then cmdtext = cmdtext || ' and (subconto2 = '||:subconto2||') ';
  if (:subconto3 is not null) then cmdtext = cmdtext || ' and (subconto3 = '||:subconto3||') ';
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661129
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Alimkulov!
You wrote on 4 июня 2014 г. 11:25:25:

Alimkulov> Для того, что проверить и включит в запрос
>
> if (:subconto1 is not null) then cmdtext = cmdtext || ' and
(subconto1 = '||:subconto1||') ';
> if (:subconto2 is not null) then cmdtext = cmdtext || ' and
(subconto2 = '||:subconto2||') ';
> if (:subconto3 is not null) then cmdtext = cmdtext || ' and
(subconto3 = '||:subconto3||') ';
для этого EXECUTE не нужен.
пиши в запросе:

[sql]AND (subconto1 = :subconto1 OR :subconto1 IS NULL)[/sql]

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661133
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

is null или is not null?
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661160
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил задачу написав так внутри триггера без процедуре
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select first 1 acc.enddt, acc.endct
    from acctotal acc
    where ((acc.daterest < new.daterest) and (acc.accid = new.accid) and (acc.kind = new.kind)
        and (acc.subconto1 = new.subconto1 or (new.subconto1 is null))
        and (acc.subconto2 = new.subconto2 or (new.subconto2 is null))
        and (acc.subconto3 = new.subconto3 or (new.subconto3 is null)))
    order by acc.daterest desc
    into new.enddt, new.endct;



Заметил что, при передаче null значение в процедуре в качестве параметра, система пойдет на конфликт с скриптом!
Вот теперь не понятно. Почему эта
Код: plsql
1.
and (acc.subconto1 = new.subconto1 or (new.subconto1 is null))

заработало?
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38661995
/0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
/0
Гость
Приоритет операций?
Скобки скорректировали...
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38662034
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov Здесь Doc.EXECUTESTATEMENTFB2 написано
при всем уважении к ИБэксперту не стоит читать то, что они копируют себе с firebirdsql.org. Читать надо оригинал
http://www.firebirdsql.org/refdocs/langrefupd25-psql-execstat.html
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38662420
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov, извлеки этот запрос как-нибудь. Например, заведи таблицу и вставь в неё текст запроса в автономной транзакции, перед тем, как выполнять его. После эпик фейла достаёшь текст запроса из таблицы и пытаешься выполнить его в ibexpert. И имей в виду, что пользователь, запускающий твой код, должен будет иметь права на чтение acctotal. Всегда ли это допустимо в твоём приложении? Я от подобных мыслей перешёл на трёхзвенку.
...
Рейтинг: 0 / 0
Реально ли execute statement или это миф (Firebrid 2.5)
    #38662868
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё понятно. Всем спасибо!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Реально ли execute statement или это миф (Firebrid 2.5)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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