如何在Mysql准备语句中设置OUT参数?

时间:2013-12-08 23:11:01

标签: mysql

PROCEDURE count_apples(OUT cnt INT)
BEGIN

   SET @SqlQuery = 'SELECT count(apple) FROM tree';

   PREPARE PrepStmt1 FROM @SqlQuery;
   EXECUTE PrepStmt1;

   DEALLOCATE PREPARE PrepStmt1;

END

如何将out参数设置为语句返回的值?

1 个答案:

答案 0 :(得分:2)

您可以完全不需要准备好的声明,例如:

PROCEDURE count_apples(OUT cnt INT)
BEGIN

   SET cnt = (SELECT count(apple) FROM tree);

END

但是,如果这只是一个示例,并且您的查询实际查询更复杂,以至于您确实需要预准备语句,那么您需要使用用户定义的变量来保存结果,然后将其复制到{{1} }参数,表现为程序变量。

OUT

您不能在准备好的语句中引用任何存储的程序变量(in,out,inout,声明或其他) - 仅user-defined variables,以{{1开头并且与任何同名的程序变量完全无关。

您必须复制值的原因是预准备语句的作用域是创建它们的会话 - 而不是过程。它们存在于程序底层的环境中,而不是程序本身。要查看此操作,请PROCEDURE count_apples(OUT cnt INT) BEGIN SET @SqlQuery = 'SET @cnt = (SELECT count(apple) FROM tree)'; PREPARE PrepStmt1 FROM @SqlQuery; EXECUTE PrepStmt1; DEALLOCATE PREPARE PrepStmt1; SET cnt = @cnt; END 在过程中准备好一份声明,但不要@PREPARE。然后,当该过程完成后,您将发现您仍然可以EXECUTE该过程。

出于同样的原因,如果您为DEALLOCATE PREPARE占位符EXECUTE stmt EXECUTE个变量,那么这些变量也必须是USING个用户定义的变量 - 您可以由于准备好的陈述的范围,也不要在那里使用程序变量。