免费注册 查看新帖 |

Chinaunix

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

【已解决】MySQL 一题目,存储过程报错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-03 12:59 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2012-12-04 09:52 编辑

# add by cenalulu: 解答见2、3楼

刚学MySQL在做一题目,但一直出现错误。

题目是关于最小生成树,给一个新的路径然后检查已有路径中有没有路相连。

例子:
edge_set = '1:2,3:5,2:9,1:7,5:10' // (1->2,3->5,2->9,1->7,5->10)
new_path = '1:9'       // (1->2, 2->9) 所以 1:9 已经在 edge_set 里

我的思路是

1) 如果 edge_set 是空的 或 只有一個 path 而且 path != new_path, return FALSE
2) 如果 new_path 在 edge_set 里, return TRUE
3) 从 edge_set 里抽出第一个 path 和 new_path 比较,
    如果 path 左节点 和 new_path 左节点是一样, sub_path = path右节点->new_path右节点  // path=1:2, new_path=1:9, sub_path=2:9
    如果 path 右节点 和 new_path 右节点是一样, sub_path = path左节点->new_path左节点  // path=1:5, new_path=2:5, sub_path=1:2
    edge_set = edge_set - path
    回到 1)  // call check_path(sub_path, edge_set, is_cyclic)
  1. drop procedure if exists check_path;

  2. DELIMITER //
  3. CREATE procedure check_path(
  4.         in new_path varchar(512),
  5.                in edge_set varchar(1024),
  6.         out is_cyclic bool
  7. )
  8. BEGIN
  9.         DECLARE sub_path varchar(512);
  10.         DECLARE temp_edge_set varchar(1024);
  11.         DECLARE comma_index int;
  12.         DECLARE colon_index int;
  13.         DECLARE left_sub_node varchar(256);
  14.         DECLARE right_sub_node varchar(256);
  15.         DECLARE left_node varchar(256);
  16.         DECLARE right_node varchar(256);

  17.         set comma_index = locate(',', edge_set);
  18.         IF LENGTH(edge_set) = 0 OR comma_index = 0 AND find_in_set(new_path, edge_set) = 0 THEN
  19.                 SET is_cyclic = FALSE;
  20.         ELSEIF find_in_set(new_path, edge_set) <> 0 THEN
  21.                 SET is_cyclic = TRUE;
  22.         ELSE
  23.                 SET sub_path = SELECT SUBSTRING_INDEX(edge_set, ',', 1);
  24.                 SET temp_edge_set = SELECT SUBSTRING(edge_set FROM comma_index + 1);
  25.                 SET left_node = SELECT SUBSTRING_INDEX(new_path, ':', 1);
  26.                 SET right_node = SELECT SUBSTRING(locate(':', new_path)  FROM colon_index + 1);
  27.                 SET left_sub_node = SELECT SUBSTRING_INDEX(sub_path, ':', 1);
  28.                 SET right_sub_node = SELECT SUBSTRING(locate(':', sub_path)  FROM colon_index + 1);

  29.                 IF left_node = left_sub_node THEN
  30.                         IF right_node > right_sub_node THEN
  31.                                 SET sub_path = CONCAT(right_sub_node, ':', right_node);
  32.                         ELSE
  33.                                 SET sub_path = CONCAT(right_node, ':', right_sub_node);
  34.                 ELSEIF right_node = right_sub_node THEN
  35.                         IF left_node > left_sub_node THEN
  36.                                 SET sub_path = CONCAT(left_sub_node, ':', left_node);
  37.                         ELSE
  38.                                 SET sub_path = CONCAT(left_node, ':', left_sub_node);
  39.                 CALL check_path(sub_path, temp_edge_set, is_cyclic);
  40. END //
  41. DELIMITER ;
复制代码
Error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT SUBSTRING_INDEX(edge_set, ',', 1);
        SET temp_edge_set = SELECT SUBSTRI' at line 22

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
2 [报告]
发表于 2012-12-03 13:08 |只看该作者
set xxx = xxx; 不需要select,直接跟上函数即可

论坛徽章:
0
3 [报告]
发表于 2012-12-03 23:15 |只看该作者
回复 2# cenalulu

明白了, 還有我忘了加 max_sp_recursion_depth 和 ENDIF.

問題解決掉了, 謝謝

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
4 [报告]
发表于 2012-12-04 10:49 |只看该作者
现在不喜欢写s一类的,特别是有那种复杂逻辑的

年轻人长进很快啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP