Страница 1 из 1

Вызов селективной процедуры с параметром как набора данных

Добавлено: 27 сен 2013, 21:34
vsimashko
Здравствуйте
FB 2.5 диалект 3
Подскажите, почему такой запрос работает корректно:

Код: Выделить всё

select c.nclient_id, c.vaccount,
      ( select a.VADDRESS_SHORT from GET_CLIENT_ADDRESS(c.nclient_id) a ) as VADDRESS_SHORT
      from client c
      order by c.vaccount;
А вот такой - нет:

Код: Выделить всё

select c.nclient_id, c.vaccount, a.VADDRESS_SHORT
      from client c, GET_CLIENT_ADDRESS(c.nclient_id) a
      order by c.vaccount;
- исключение
"The cursor identified in the UPDATE or DELETE statement is not positioned on a row.
no current record for fetch operation."
Процедура GET_CLIENT_ADDRESS формирует строку адреса (из разных таблиц), присваивает её выходной переменной, далее Suspend; Exit; .
Если ту же процедуру вызывать внутри другой, то второй запрос работает, но лишь при условии, что входным параметром не поле таблицы, а переменная:

Код: Выделить всё

 ... GET_CLIENT_ADDRESS(:INP_nclient_id) ...
Спасибо

отредактировано модератором: - для оформления кода есть специальный тег в верхнем меню редактора текста.

Re: Вызов селективной процедуры с параметром как набора данн

Добавлено: 28 сен 2013, 14:49
Dimitry Sibiryakov

Re: Вызов селективной процедуры с параметром как набора данн

Добавлено: 28 сен 2013, 23:54
kdv
потому что конструкция

Код: Выделить всё

from client c, GET_CLIENT_ADDRESS(c.nclient_id)
сервером никак не может быть опознана как join. Это вы себе логику придумываете, а сервер делает объединения таблиц несколько иначе.

И, на поиск в гугле фразы
no current record for fetch operation
выдаются вполне вменяемые ответы. В частности такой
http://www.firebirdfaq.org/faq144/

Re: Вызов селективной процедуры с параметром как набора данн

Добавлено: 29 сен 2013, 22:37
vsimashko
Большое спасибо, Left Join помог :

Код: Выделить всё

select c.nclient_id, c.vaccount, a.VADDRESS_SHORT
  from client c left join GET_CLIENT_ADDRESS(c.nclient_id) a on 1=1
  order by c.vaccount
Погуглил недобросовестно, виноват. :oops: