2013-08-13 6 views
0

Возможно ли вернуть результат операции выбора в хранимую процедуру до того, как процедура будет выполнена? Например:Возвращение результата хранимой процедуры MySQL до конца процедуры

Create Procedure 'TestProc'() 
Begin 

//Do some stuff 

Select 'column' from table'; 

//Do some more stuff 

End 

Можно ли вернуть результат выбора заявления сразу и иметь процедуру продолжают делать это вещь послесловия?

Благодаря

+0

Нет, и остальная часть этого ответа заключается только в том, чтобы выполнить минимальное требование 15 символов. – BlackTigerX

ответ

0

какой материал вы желая продолжать это делать после того, как выбрать? Может быть, вы можете вставить запрос выбора в временную таблицу, продолжить делать другие вещи, а затем, наконец, выбрать в самом конце? Значения temp table все равно будут выглядеть так, как если бы они были возвращены средней рутиной, но вы все равно могли бы продолжать делать «другие вещи».

Редактировать снизу комментарий: Для меня это следует обращаться из приложения делает следующий -break текущей хранимой процедуры до 2-х частей в

  1. Вызовите первый Вставить хранимую процедуру из код, который берет первую часть строки и вставляет ее в базу данных. Верните идентификатор в приложение

  2. Приложение принимает возвращаемый идентификатор и вызывает вторую хранимую процедуру (занимает много времени) и передает 2 параметра. Идентификатор и остальная часть строки.

  3. База данных продолжается с остальной частью вставки, пока ваше приложение продолжается.

+0

Спасибо за ответ. Эта процедура принимает очень большую разделительную строку в качестве параметра. В начале процедуры я разбираю часть строки и вставляю ее. После первой вставки я делаю выбор в вопросе. Он возвращает значение last_insert_id вставки. Это единственное значение, которое связано с приложением, называемым процедурой. После выбора I затем проанализируйте оставшуюся часть строки и запустите цикл while, чтобы вставить много вставок. Это занимает немного времени и вызывает проблему с приложением ... –

+0

см. Обновленный ответ выше – mscard02

+0

Да, я бы сделал это, но, к сожалению, у меня нет контроля над приложением. По крайней мере, не эта часть кода ... –

0

Вы можете закончить процедуру, делая это:

CREATE PROCEDURE myProcedure(Val INT) 
proc:BEGIN 

IF Val=5 then 
Select ‘Bye’; 
LEAVE proc; 
END IF; 

Select * from myTable t t.Value=Value; 

END; 
+0

Итак, даже после того, как вы оставите процедуру, она будет продолжать выполнять ваш оператор select или кучу инструкций вставки в моем случае? –

0

Кажется, как будто вы на самом деле не пробовал это.

Безграничный оператор SELECT (т. Е. Не в подзапросе, производной таблице или SELECT ... INTO) немедленно возвращает результат клиенту.

MySQL поддерживает очень полезное расширение, которое позволяет использовать регулярные операторы SELECT (то есть без использования курсоров или локальных переменных) внутри хранимой процедуры. Результирующий набор такого запроса просто отправляется непосредственно клиенту.

http://dev.mysql.com/doc/refman/5.6/en/stored-routines-syntax.html

Результаты посылают клиенту, как только они будут доступны, а не после того, как процедура завершается. Это легко продемонстрировать, вызвав процедуру с клиентом командной строки MySQL.

Проблема у вас будет, однако, является то, что ваше приложение поток необходимо в конечном итоге ждать процедуры прекратить, потому что если он разъединяет слишком рано, процедура может прервать или приложение может попытаться повторно использовать подключение к базе данных другой запрос перед выполнением процедуры, что приводит к результатам, которые в лучшем случае были бы непредсказуемыми.

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

0
Create Procedure 'TestProc'() Begin 

//Do some stuff 
Insert into temptable(column) 
Select 'column' from table'; 

//Do some more stuff 

End 

Примечание: Таким образом, вы можете получить доступ к значению выбрать из TempTable и процедуры будет продолжать выполнение позже вещей.

После того, как вы получили доступ к значению, вы можете удалить его из таблицы. Чтобы добавить больше, вы можете вставить идентификатор уровня сессии для бифуркации.