MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 3051|回复: 6
打印 上一主题 下一主题

[存储过程及函数] 一个删除指定表中指定数据的存储过程,求指出其错误的地方,新人求教

[复制链接]
跳转到指定楼层
1#
发表于 2014-3-31 10:58:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.前提条件:数据库中存在若干表,每张表里都存在id字段例:student 表
CREATE TABLE `student` (
  `id` int(10) NOT NULL,
  `NAME` varchar(20) NOT NULL,
  `sex` varchar(4) DEFAULT NULL,
  `birth` year(4) DEFAULT NULL,
  `department` varchar(20) DEFAULT NULL,
  `address` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8



INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');
INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区');
INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市');
INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');
INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');

2.编写存储过程
目标:执行此存储过程可删除“指定表”中的“指定数据”
DELIMITER //
CREATE PROCEDURE run(
        IN tablename VARCHAR(20),
        IN i VARCHAR(20)
)
BEGIN
        DECLARE b VARCHAR(20);
        SET b = CONCAT('delete from ' , tablename , ' where id = ' , i);
        SET @e = b;
        PREPARE stm1 FROM @e;
                EXECUTE stm1;
                DEALLOCATE PREPARE stm1;
END //
DELIMITER ;

3.疑惑
此存储过程经过调用后 如: call run('student','901');

并未删除指定的student表中 id 为901 的数据,而是将表中全部数据清空。
本人菜鸟,刚刚开始自学mysql,这个例子也是参照网上一个删除指定数据库中的某个表的例子自己修改的,我觉得问题是处在where id = ‘i’这里,但是不知道该怎么改,还请大家不吝赐教



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
发表于 2014-3-31 17:55:31 | 只看该作者
  PREPARE stmtDeleteExpiredOfflineNotify FROM 'delete from GRP_OfflineNotify where CreateTime<? limit ?';
  SET @createTime = v_expiresAt;
  SET @maxCount = v_count;
  EXECUTE stmtDeleteExpiredOfflineNotify USING @createTime,@maxCount;

这样删除表里数据时没有问题的。

但你这个有表名在里面,你的写法也应该是没有问题的。
一步步找问题吧,你打印下你的b参数看看构造的SQL有没有问题吧
@e = b这句是啥意思?可以省略吧,如果b构造的不对,那么此句可以再加入个concat()来构造,你自己试试吧...

3#
发表于 2014-3-31 23:36:16 | 只看该作者
变量b varchar(20)声明长一点,比如为VARCHAR(64)即可。
4#
 楼主| 发表于 2014-4-3 13:20:42 | 只看该作者
nycle 发表于 2014-3-31 23:36
变量b varchar(20)声明长一点,比如为VARCHAR(64)即可。

多谢大侠指点!!!,真的好用了,多谢大侠,多谢大侠,多谢大侠
5#
 楼主| 发表于 2014-4-3 13:21:38 | 只看该作者
kider 发表于 2014-3-31 17:55
这样删除表里数据时没有问题的。

但你这个有表名在里面,你的写法也应该是没有问题的。

多谢您的鼎力帮助,其实就像另一位前辈说的,吧b的长度设置长一些就好了
6#
发表于 2014-6-16 22:37:39 | 只看该作者
(root@localhost) [test]>call run('student','901');
ERROR 1406 (22001): Data too long for column 'b' at row 1

我这里执行报错了,你应该执行也会报错的,看看你的sql_mode 设置呢
7#
 楼主| 发表于 2014-6-17 13:50:18 | 只看该作者
CloudHorizon 发表于 2014-6-16 22:37
(root@localhost) [test]>call run('student','901');
ERROR 1406 (22001): Data too long for column 'b' ...

呃,我这边真心没有报错,很成功
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 12:13 , Processed in 0.103585 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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