Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Реально ли execute statement или это миф (Firebrid 2.5) / 12 сообщений из 12, страница 1 из 1
04.06.2014, 11:05:53
    #38661094
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
Привет всем! Здесь 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
04.06.2014, 11:13:24
    #38661104
Поручик ·· Ржевский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
вот тут:
Код: sql
1.
cmdtext = cmdtext || 'where (daterest < '||:daterest||') (accid = '||:accid||') and (kind = '||:kind||') ';


ашипка.

не хватает AND.

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

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

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

Там у меня
Код: plsql
1.
  cmdtext = cmdtext || 'where (daterest < '||:daterest||') and (accid = '||:accid||') and (kind = '||:kind||') ';
...
Рейтинг: 0 / 0
04.06.2014, 11:22:52
    #38661119
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
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
04.06.2014, 11:28:08
    #38661129
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
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
04.06.2014, 11:33:19
    #38661133
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
Мимопроходящий,

is null или is not null?
...
Рейтинг: 0 / 0
04.06.2014, 11:49:05
    #38661160
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
Решил задачу написав так внутри триггера без процедуре
Код: 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
04.06.2014, 23:04:35
    #38661995
/0
/0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
Приоритет операций?
Скобки скорректировали...
...
Рейтинг: 0 / 0
05.06.2014, 00:02:22
    #38662034
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
Alimkulov Здесь Doc.EXECUTESTATEMENTFB2 написано
при всем уважении к ИБэксперту не стоит читать то, что они копируют себе с firebirdsql.org. Читать надо оригинал
http://www.firebirdsql.org/refdocs/langrefupd25-psql-execstat.html
...
Рейтинг: 0 / 0
05.06.2014, 12:17:25
    #38662420
budden
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
Alimkulov, извлеки этот запрос как-нибудь. Например, заведи таблицу и вставь в неё текст запроса в автономной транзакции, перед тем, как выполнять его. После эпик фейла достаёшь текст запроса из таблицы и пытаешься выполнить его в ibexpert. И имей в виду, что пользователь, запускающий твой код, должен будет иметь права на чтение acctotal. Всегда ли это допустимо в твоём приложении? Я от подобных мыслей перешёл на трёхзвенку.
...
Рейтинг: 0 / 0
05.06.2014, 18:17:16
    #38662868
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реально ли execute statement или это миф (Firebrid 2.5)
Всё понятно. Всем спасибо!
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Реально ли execute statement или это миф (Firebrid 2.5) / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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