【问题标题】:MySQL stored procedure return result before end of procedureMySQL存储过程在过程结束前返回结果
【发布时间】:2013-08-14 11:29:22
【问题描述】:

是否可以在存储过程完成运行之前返回选择语句的结果?例如:

Create Procedure 'TestProc'()
Begin

//Do some stuff

Select 'column' from table';

//Do some more stuff

End

是否可以立即返回 select 语句的结果,并让程序继续做它的事情?

谢谢

【问题讨论】:

  • 不,这个答案的其余部分只是为了完成 15 个字符的最低要求。

标签: mysql stored-procedures


【解决方案1】:

选择之后你想继续做什么样的事情?也许您可以将选择查询插入临时表,继续做其他事情,然后最后选择?临时表的值仍会像在例程中返回一样,但您仍然可以继续做“其他事情”。

从下面的评论编辑: 对我来说,这应该通过执行以下操作的应用程序来处理 - 将当前存储过程分成两部分

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

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

  3. 当您的应用程序继续运行时,数据库会继续执行其余的插入操作。

【讨论】:

  • 感谢您的回复。此过程以非常大的分隔字符串作为参数。在程序开始时,我解析部分字符串并进行插入。在第一次插入之后,我进行了有问题的选择。它返回插入的 last_insert_id 值。这是调用程序的应用程序所关心的唯一值。在选择之后,我解析字符串的剩余部分,并运行一个while循环来插入很多插入。这需要一点时间并导致应用程序出现问题...
  • 是的,我会这样做,但不幸的是我无法控制它自己的应用程序。至少不是那部分代码...
【解决方案2】:

你可以完成这个过程:

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】:

好像你还没有真正尝试过。

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

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

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

结果一可用就立即发送给客户端,而不是在程序终止之后。这很容易通过使用 MySQL 命令行客户端调用该过程来演示。

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

如果您的应用程序可以可靠地等待过程执行结束,那么这将满足您的要求;否则,您将需要不同的解决方案。

【讨论】:

    【解决方案4】:
    Create Procedure 'TestProc'() Begin
    
    //Do some stuff
    Insert into temptable(column)
    Select 'column' from table';
    
    //Do some more stuff
    
    End
    

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2015-06-03
      • 2013-06-21
      相关资源
      最近更新 更多