免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1808 | 回复: 5
打印 上一主题 下一主题

在存储过程中使用IN语法出了点问题,请教大虾 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-09 15:53 |只看该作者 |倒序浏览
我写的存储过程如下:

  1. CREATE PROCEDURE `cate_getRoute`(_id INTEGER(4))
  2. BEGIN
  3. DECLARE x_path char(255);
  4. select `path` from `cate` where `id`=_id  into x_path ;
  5. select `id`,`name` from `cate` where cate.id in  (x_path);
  6. END
复制代码


其中path字段的格式如:0,15,16。该存储过程的作用是先从cate表中根据_id参数取出path的值,并赋给x_path,然后在从cate表中查询出所有id在x_path中的行,执行起来虽然没报错,但没取出任何数据:如下


  1. mysql> call cate_getRoute(15);
  2. Empty set

  3. Query OK, 0 rows affected
复制代码


请教这是什么原因?存储过程中x_path变量的问题?

直接在CONSOLE运行sql正常,如下:

  1. mysql> select `id`,`name` from `cate` where cate.id in  (0,15,16) ;
  2. +-------+------+
  3. | id    | name |
  4. +-------+------+
  5. | 00015 | fdsf |
  6. | 00016 | fdsf |
  7. +-------+------+
  8. 2 rows in set
复制代码

正常


  1. mysql> select `path` from `cate` where `id`=15;
  2. +------+
  3. | path |
  4. +------+
  5. | 0,15 |
  6. +------+
  7. 1 row in set
复制代码

正常

[ 本帖最后由 暖暖咖啡 于 2007-1-9 17:34 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-01-09 16:49 |只看该作者

  1. select @x_path:=`path` from `cate` where `id`=_id;
  2. select `id`,`name` from `cate` where cate.id in  (@x_path) ;
复制代码


试试看

论坛徽章:
0
3 [报告]
发表于 2007-01-09 17:38 |只看该作者
原帖由 yejr 于 2007-1-9 16:49 发表

  1. select @x_path:=`path` from `cate` where `id`=_id;
  2. select `id`,`name` from `cate` where cate.id in  (@x_path) ;
复制代码


试试看



  1. CREATE PROCEDURE `cate_getRoute`(_id INTEGER(4))
  2. BEGIN

  3. select @x_path:=`path` from `cate` where `id`=_id;
  4. select `id`,`name` from `cate` where cate.id in  (@x_path) ;

  5. END

复制代码



  1. mysql> call cate_getRoute(15);
  2. +-----------------+
  3. | @x_path:=`path` |
  4. +-----------------+
  5. | 0,15            |
  6. +-----------------+
  7. 1 row in set

  8. Empty set
复制代码


顺便请教一下版主,:=是什么意思,变量前加@仅仅是个个人习惯还是?

论坛徽章:
0
4 [报告]
发表于 2007-01-09 17:40 |只看该作者
我怀疑重点应该放在in这个语法上

论坛徽章:
0
5 [报告]
发表于 2007-01-09 20:25 |只看该作者
我以前也做过类似的存储过程,但是用那种变量表示方法会有问题,改成 @var 的格式就好了。

  1. @var = 'xxx'
复制代码

只是一个赋值语法而已

论坛徽章:
0
6 [报告]
发表于 2007-01-09 23:08 |只看该作者
总算搞明白了:
在Mysql的官方文档可以看出,in 后面跟的参数应该一个list或者subquery,而在我写的存储过程中,x_path已经被当成一个字符串了,所以查询出来是0条记录。
直接给出类似0,15,16这样的常量参数后,MYSQL可以把它认为或者是转换为列表,反之,字符串变量就不行(自己猜的)。

所以,我换了一个MYSQL函数:FIND_IN_SET,写法如下:

  1. CREATE PROCEDURE `cate_getRoute`(_id INTEGER(4))
  2. BEGIN
  3. DECLARE x_path char(255);
  4. select `path` from `cate` where `id`=_id  into x_path ;
  5. select `id`,`name` from `cate` where  FIND_IN_SET(`id`,x_path);
  6. END
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP