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参数设置为语句返回的值?
答案 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
个用户定义的变量 - 您可以由于准备好的陈述的范围,也不要在那里使用程序变量。