MySQL存储过程在程序结束前返回结果

时间:2013-08-13 01:03:34

标签: mysql stored-procedures

在程序运行之前,是否可以在存储过程中返回select语句的结果?例如:

Create Procedure 'TestProc'()
Begin

//Do some stuff

Select 'column' from table';

//Do some more stuff

End

是否有可能立即返回select语句的结果并让程序继续做后面的事情?

由于

4 个答案:

答案 0 :(得分:1)

你想在选择后继续做什么样的东西?也许你可以将select查询插入临时表,继续做其他的东西,最后选择最后?临时表值仍然就像它们在例程中返回一样,但您仍然可以继续执行“其他内容”。

从以下评论中进行修改: 对我来说,这应该从执行以下操作的应用程序处理 - 将当前存储过程分为两部分

  1. 从获取字符串第一部分的代码中调用第一个插入存储过程并将其插入数据库。将Id返回给应用程序

  2. 应用程序获取它收到的id,并调用第二个存储过程(耗时一个)并传递2个参数。 id和字符串的其余部分。

  3. 当您的应用程序继续运行时,数据库将继续插入其余部分。

答案 1 :(得分:1)

好像你没有真正试过这个。

无界SELECT语句(即,不在子查询,派生表或SELECT ... INTO中)将立即将结果返回给客户端。

  

MySQL支持一个非常有用的扩展,它允许在存储过程中使用常规SELECT语句(即,不使用游标或局部变量)。这种查询的结果集只是直接发送给客户端。

     

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

结果会在客户端可用时立即发送给客户端,而不是在程序终止后发送。通过使用MySQL命令行客户端调用该过程可以很容易地证明这一点。

但是,您将遇到的问题是您的应用程序线程必须最终等待该过程终止,因为如果它过早断开连接,该过程可能会中止或应用程序可能会尝试重用在程序完成之前,为不同的请求建立数据库连接,导致结果最多是不可预测的。

如果您的应用程序可以在程序执行结束时可靠地保留,那么这将完成您想要的操作;否则,你需要一个不同的解决方案。

答案 2 :(得分: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;

答案 3 :(得分:0)

Create Procedure 'TestProc'() Begin

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

//Do some more stuff

End

注意:这样你就可以访问temptable中的select值,程序将继续执行后面的东西。

访问该值后,您可以从表中删除它。要添加更多内容,您可以为分叉插入一些会话级别标识符。