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

У меня есть хранимая процедура MYSQL SP1 (), которая возвращает набор результатов.

Я хочу вызвать SP1 () внутри SP2 () и просмотреть результирующий набор SP1 (), чтобы выполнить дополнительную работу.

Я не хочу включать свою логику из SP1 (), потому что это сделало бы SP2 () слишком сложным.

Какие-либо предложения?

Спасибо.


person makstaks    schedule 17.03.2010    source источник


Ответы (2)


То, что вы хотите сделать, звучит не очень хорошо, и, возможно, вам стоит подумать о перепроектировании этих двух процедур. Однако вы можете сделать что-то вроде этого в качестве быстрого исправления:

пусть ваш sproc sp2 записывает промежуточные результаты во временную таблицу, к которой вы затем можете получить доступ / обработать внутри sp1. Затем вы можете удалить временную таблицу, созданную в sp2, после того, как sp1 вернется.

http://pastie.org/883881

delimiter ;
drop procedure if exists foo;
delimiter #

create procedure foo()
begin

  create temporary table tmp_users select * from users;

  -- do stuff with tmp_users

  call bar();

  drop temporary table if exists tmp_users;

end #

delimiter ;

drop procedure if exists bar;

delimiter #

create procedure bar()
begin
  -- do more stuff with tmp_users
  select * from tmp_users;
end #

delimiter ;

call foo();

не очень элегантно, но должно помочь

person Jon Black    schedule 23.03.2010
comment
да, я в конечном итоге переделал хранимые процедуры, решение близко к вашему предложению. SP1 () теперь создает временную таблицу, а затем, используя курсор для каждой прочитанной строки, я вызываю SP2 (). Не знаю, хорошая ли это практика, но пока она работает. - person makstaks; 03.04.2010
comment
@ f00 У меня тот же сценарий, что и у hmak. Я использовал временную таблицу в SP2 () и возвращал временную таблицу в sp2 (), затем использовал временную таблицу в sp1 (), она работает нормально для меня, но не знаю, что это хорошая практика, позвольте мне знаете, что это хорошая практика? код создайте процедуру foo () begin call bar (); выберите tmptbl; удалить временную таблицу, если она существует tmp_users; конец # - person MSTdev; 09.04.2014

Курсоры помогут решить проблему.

Я не уверен, возможно ли это, но сделайте курсор для вызова select для SP1 () и перебирайте их как обычный курсор.

person Kapil D    schedule 18.03.2010
comment
Невозможно создать курсор на CALL. - person dolmen; 22.01.2020