如何在Mysql准备的语句中设置param?

如何在Mysql准备的语句中设置param?,mysql,Mysql,如何将out参数设置为语句返回的值?对于简单的示例,您根本不需要准备好的语句: 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参数设置为语句返回的值?

对于简单的示例,您根本不需要准备好的语句:

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
参数,该参数的行为类似于程序变量

PROCEDURE count_apples(OUT cnt INT)
BEGIN

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

END
您不能在准备好的语句中引用任何存储的程序变量(in、out、inout、DECLAMED或其他),只能引用以
@
开头且与任何同名程序变量完全无关的语句

必须复制这些值的原因是,准备好的语句的作用域是创建它们的会话,而不是过程。它们存在于过程的底层环境中,而不是过程本身内部。要查看此操作,请在过程中准备一个已准备好的语句,但不要执行它或取消分配它。然后,当该过程完成时,您会发现仍然可以执行该过程

出于同样的原因,如果
使用
占位符的
变量执行
stmt
占位符,那么这些变量也必须是
@
用户定义的变量——由于准备语句的范围,您也不能在那里使用程序变量

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