MySQL社区

标题: 一个删除指定表中指定数据的存储过程,求指出其错误的地方,新人求教 [打印本页]

作者: 上官云海    时间: 2014-3-31 10:58
标题: 一个删除指定表中指定数据的存储过程,求指出其错误的地方,新人求教
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’这里,但是不知道该怎么改,还请大家不吝赐教




作者: kider    时间: 2014-3-31 17:55
  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()来构造,你自己试试吧...


作者: nycle    时间: 2014-3-31 23:36
变量b varchar(20)声明长一点,比如为VARCHAR(64)即可。
作者: 上官云海    时间: 2014-4-3 13:20
nycle 发表于 2014-3-31 23:36
变量b varchar(20)声明长一点,比如为VARCHAR(64)即可。

多谢大侠指点!!!,真的好用了,多谢大侠,多谢大侠,多谢大侠

作者: 上官云海    时间: 2014-4-3 13:21
kider 发表于 2014-3-31 17:55
这样删除表里数据时没有问题的。

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

多谢您的鼎力帮助,其实就像另一位前辈说的,吧b的长度设置长一些就好了

作者: CloudHorizon    时间: 2014-6-16 22:37
(root@localhost) [test]>call run('student','901');
ERROR 1406 (22001): Data too long for column 'b' at row 1

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

呃,我这边真心没有报错,很成功





欢迎光临 MySQL社区 (http://www.mysqlpub.com/) Powered by Discuz! X3.2