MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 3508|回复: 9

[存储过程及函数] 存储过程中关于@变量的疑惑

[复制链接]
发表于 2014-7-18 14:55:04 | 显示全部楼层 |阅读模式
本帖最后由 roster 于 2014-7-18 15:06 编辑

在存储过程中,同时定义了 DECLARE 和 @  变量。发现效果不同求解答。

  1. <P>
  2. <P>CREATE PROCEDURE PROC_EXECUTE_SQL(IN IN_ID INT ,OUT O_BATCH_NBR VARCHAR(10))
  3. BEGIN
  4. # 学习用动态语句实现查询,并输出
  5. DECLARE V_SQL VARCHAR(200) DEFAULT NULL;
  6. DECLARE V_BATCH_NBR  VARCHAR(10) DEFAULT NULL;

  7. SET V_SQL='SELECT BATCH_NBR INTO @V_BATCH_NBR FROM HIS_SYNC_DATA_LOG WHERE ID=? ';
  8. <FONT color=red>-- 这里into 后面的语句如果用定义好的 v_batch_nbr 无法传递出查询结果。
  9. </FONT>#执行动态语句必须三个步骤
  10. #绑定执行语句 PREPARE
  11. set @AAAAA=V_SQL; -- <FONT color=red>不进行这个转换编译就会报错
  12. </FONT>PREPARE ES_SQL FROM @AAAAA; </P>
  13. <P>#PREPARE ES_SQL FROM V_SQL;    -- <FONT color=red>V_SQL 上面declare 定义的变量,可是如直接使用会报错 </FONT></P>
  14. <P>#执行语句
  15. set @BBBBB=IN_ID;
  16. EXECUTE ES_SQL USING @BBBBB;</P>
  17. <P>#EXECUTE ES_SQL USING IN_ID;  #<FONT color=red>传入参数 上面declare 定义的变量,可是如直接使用会报错 </FONT></P>
  18. <P> </P>
  19. <P>
  20. #解除绑定语句
  21. DEALLOCATE PREPARE ES_SQL;   

  22. set O_BATCH_NBR = @V_BATCH_NBR;

  23. END;</P></P>
复制代码
红色标注就是我的疑惑, DECLARE 定义的变量作用与 begin end 间,理论来说和@定义的变量,效果一样。为啥执行起来有差异。初学不知其中原理。求解答
 楼主| 发表于 2014-7-18 15:07:30 | 显示全部楼层
自己顶上去,期待高手解答
发表于 2014-7-18 16:39:43 | 显示全部楼层
没有红色,也看不清楚。
@在MySQL里是个比较特殊和好用的变量使用方式,但如果在存储过程中,最好就用一种,都用DECLARE看起来更好些吧。
个人建议,不用管什么差异,用着吧。
 楼主| 发表于 2014-7-18 17:30:40 | 显示全部楼层
kider 发表于 2014-7-18 16:39
没有红色,也看不清楚。
@在MySQL里是个比较特殊和好用的变量使用方式,但如果在存储过程中,最好就用一种 ...

你帮忙看看 ‘-- ’注释的内容
关键是DECLARE 在引用时,执行会报错
 楼主| 发表于 2014-7-18 17:34:55 | 显示全部楼层
kider 发表于 2014-7-18 16:39
没有红色,也看不清楚。
@在MySQL里是个比较特殊和好用的变量使用方式,但如果在存储过程中,最好就用一种 ...

你可以试试,就有定义declare 和 @ 变量,用动态语句模式执行。
我的疑惑在用,declare 定义的变量不能,起到变量作用,会出现执行错误,或者无法正常传递数据。
 楼主| 发表于 2014-7-21 09:08:57 | 显示全部楼层
自己再顶上去,期待解答疑问
发表于 2014-7-21 11:50:39 | 显示全部楼层
抱歉,我上面应该是说的不对。
在MySQL动态语句中,变量是要用@开头的才对,可以在之前是没有提前declare声明...
 楼主| 发表于 2014-7-21 17:04:11 | 显示全部楼层
kider 发表于 2014-7-21 11:50
抱歉,我上面应该是说的不对。
在MySQL动态语句中,变量是要用@开头的才对,可以在之前是没有提前declare ...

意思是说,mysql 的动态语句只能用@变量,declare是不行的是吗?除了这个特殊,还有其它特殊的地方吗?请指导一下。
发表于 2014-7-22 08:25:48 | 显示全部楼层
用自定义的你需要先拼成字符串,直接动态的传参数是不行的,建议用自定义的,但是自定义的变量需要注意引号需要自己拼接,而@变量则不需要
 楼主| 发表于 2014-7-22 09:01:51 | 显示全部楼层
dbthink 发表于 2014-7-22 08:25
用自定义的你需要先拼成字符串,直接动态的传参数是不行的,建议用自定义的,但是自定义的变量需要注意引号 ...

您好,您说的拼接,能给个例子,我学习一下吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-3-28 18:56 , Processed in 0.072718 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表