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

Модераторы: kdv, CyberMax

Ответить
vsimashko
Сообщения: 20
Зарегистрирован: 03 мар 2010, 10:33

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

Сообщение vsimashko » 27 сен 2013, 21:34

Здравствуйте
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) ...
Спасибо

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


kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

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

Сообщение kdv » 28 сен 2013, 23:54

потому что конструкция

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

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

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

vsimashko
Сообщения: 20
Зарегистрирован: 03 мар 2010, 10:33

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

Сообщение vsimashko » 29 сен 2013, 22:37

Большое спасибо, 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:

Ответить