powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB2.5 непонятки с join stored_proc в запросе
3 сообщений из 3, страница 1 из 1
FB2.5 непонятки с join stored_proc в запросе
    #38939706
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

В базе имеется таблица и хранимая процедура:

Код: 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.
30.
31.
create table data (
    id     integer not null,
    name   varchar(32) not null
);

alter table data
  add constraint pk_data primary key (id);

alter table data
  add constraint unq_data unique (name);

insert into data ( id, name ) values( 1, 'Name #1' );
insert into data ( id, name ) values( 2, 'Name #2' );
insert into data ( id, name ) values( 3, 'Name #3' );

commit;

set term ^ ;

create procedure sp (
    id       integer,
    name     varchar(32) )
returns (
    id_name varchar(40))
as
begin
  id_name = :id || ' - ' || :name;
  suspend;
end ^

set term ; ^



При выполнении в ISQL.EXE запроса

Код: plsql
1.
2.
3.
select d.id, d.name, p.id_name
  from data d
  join sp( d.id, d.name ) p on ( 1 = 1 );



возникает ошибка

Statement failed, SQLSTATE = 22000
no current record for fetch operation

Если в запросе указать
Код: plsql
1.
  left join sp( d.id, d.name ) p on ( 1 = 1 )


то возвращаются правильные данные

Далее, создаем хранимую процедуру - обертку вокруг указанного выше запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
set term ^ ;

create procedure join_sp
returns ( id integer,
          name varchar(32),
          id_name varchar(100) )
as
begin
  for
    select d.id, d.name, p.id_name
      from data d
      join sp( d.id, d.name ) p on ( 1 = 1 )
      into :id, :name, :id_name
  do
    suspend;
end ^

set term ; ^



При выполнении такой процедуры возвращается резалсет, но значение id_name возвращается NULL. А если для хранимой процедуры указать left join sp, то возвращаются правильные данные.

Вопросы:
- в чем принципиальное отличие JOIN от LEFT JOIN для хранимых процедур?
- почему в хранимой процедуре-обертке JOIN не вызывает ошибки (в отличие от запроса), но в параметре id_name возвращается NULL?

P.S. В Yaffil указанные запросы одинаково правильно во всех случаях.


С уважением, Polesov.
...
Рейтинг: 0 / 0
FB2.5 непонятки с join stored_proc в запросе
    #38939708
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

потому что до fb 3.0 оптимизатор не мог определить зависимость параметров процедуры и по умолчанию всегда ставил процедуры первым потоком в JOIN. Подробности здесь http://www.ibase.ru/devinfo/dataaccesspaths.htm#chapter311
...
Рейтинг: 0 / 0
FB2.5 непонятки с join stored_proc в запросе
    #38939712
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, спасибо.

Смутил тот факт, что в Yaffil все работало корректно.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB2.5 непонятки с join stored_proc в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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