在过程完成运行之前,是否可以在存储过程中返回 select 语句的结果?例如:
Create Procedure 'TestProc'()
Begin
//Do some stuff
Select 'column' from table';
//Do some more stuff
End
是否可以立即返回 select 语句的结果并让程序继续执行它的事情?
谢谢
在过程完成运行之前,是否可以在存储过程中返回 select 语句的结果?例如:
Create Procedure 'TestProc'()
Begin
//Do some stuff
Select 'column' from table';
//Do some more stuff
End
是否可以立即返回 select 语句的结果并让程序继续执行它的事情?
谢谢
好像你还没有真正尝试过这个。
无限制的SELECT
语句(即不在子查询、派生表或 中SELECT ... INTO
)将立即将结果返回给客户端。
MySQL 支持一个非常有用的扩展,它允许在存储过程中使用常规的 SELECT 语句(即,不使用游标或局部变量)。这种查询的结果集直接发送给客户端。
— http://dev.mysql.com/doc/refman/5.6/en/stored-routines-syntax.html
结果一可用就立即发送给客户端,而不是在程序终止之后。这很容易通过使用 MySQL 命令行客户端调用该过程来演示。
但是,您将遇到的问题是您的应用程序线程最终必须等待该过程终止,因为如果它断开得太快,该过程可能会中止,或者应用程序可能会尝试在该过程之前将数据库连接重用于不同的请求完成,导致结果充其量是不可预测的。
如果您的应用程序可以可靠地等待过程执行结束,那么这将满足您的要求;否则,您将需要不同的解决方案。
选择后你想继续做什么样的事情?也许您可以将选择查询插入临时表,继续做其他事情,然后最后选择?临时表的值仍然就像是在例程中返回一样,但您仍然可以继续做“其他事情”。
从下面的评论中编辑: 对我来说,这应该通过执行以下操作的应用程序来处理 - 将当前存储过程分成两部分
从获取字符串第一部分并将其插入数据库的代码中调用第一个插入存储过程。将 ID 返回给应用程序
应用程序取回它收到的 id,并调用第二个存储过程(耗时一个)并传递 2 个参数。id 和字符串的其余部分。
当您的应用程序继续运行时,数据库会继续执行其余的插入操作。
You can finish the procedure doing this:
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;
Create Procedure 'TestProc'() Begin
//Do some stuff
Insert into temptable(column)
Select 'column' from table';
//Do some more stuff
End
注意:这样您可以从 temptable 访问 select 的值,并且该过程将继续执行后面的内容。
访问该值后,您可以将其从表中删除。要添加更多内容,您可以插入一些会话级别的标识符以进行分叉。