mysql> CREATE PROCEDURE opstable(IN idtable varchar(100),IN tempt varchar(100))
-> BEGIN
-> create table idtable as select uuid() id,a.* FROM tempt a;
-> END
-> $
Query OK, 0 rows affected (0.00 sec)mysql> call opstable('idtable','stuff_temp')$
ERROR 1146 (42S02): Table 'demo.tempt' doesn't exist
怎么不能使用参数啊。、
-> BEGIN
-> create table idtable as select uuid() id,a.* FROM tempt a;
-> END
-> $
Query OK, 0 rows affected (0.00 sec)mysql> call opstable('idtable','stuff_temp')$
ERROR 1146 (42S02): Table 'demo.tempt' doesn't exist
怎么不能使用参数啊。、
prepare stml from @asql;
execute stml;
---------
翻译:
表 demo.tempt 不存在
2 create table idtable select * from tb这种只能执行一次 第二次createtable就会报错了
你好 ,你说我这样写 好嘛?可是逻辑就是这样的。
DELIMITER $ /*定义结束符号*/
/*删除已存在的对象名称*/
DROP PROCEDURE IF EXISTS operate$
/*开始创建名为operate的过程*/
CREATE PROCEDURE operate(IN tempname varchar(100),IN idtable varchar(100))
BEGIN
/*定义第一个游标找出表中的列*/
DECLARE vNum01 int default 0 ; /*该变量用来用于条件结束游标*/
DECLARE sValue01 varchar(100); /*定义一个长度为100的字符变量*/
DECLARE sId01 varchar(36);
DECLARE cur1 CURSOR FOR SELECT id,colval FROM normalize WHERE tname=tempname;/*找出列*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vNum01=1; /*定义结束条件*/
OPEN cur1; /*打开游标*/
cur1loop:LOOP /*开始循环游标*/
FETCH cur1 INTO sId01,sValue01; /*将获取的值赋给两个变量*/
BEGIN
/*开始第二个游标找出对应列的值*/
DECLARE vNum02 int default 0 ;
DECLARE sValue02 varchar(100);
DECLARE sId02 VARCHAR(36);
DECLARE cur2 CURSOR FOR SELECT id,sValue01 FROM idtable; /*找出列值*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vNum02=1;
OPEN cur2;
cur2loop:LOOP /*开始第二个循环*/
FETCH cur2 INTO sId02,sValue02;
BEGIN
/*定义第三个游标*/
DECLARE vNum03 int default 0 ;
DECLARE sValue03 varchar(100);
DECLARE sId03 int(36);
DECLARE cur3 CURSOR FOR SELECT keynum,key_word FROM key_word; /*找出key_word表中的值*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vNum03=1;
OPEN cur3;
cur3loop:LOOP /*开始第三个循环*/
FETCH cur3 INTO sId03,sValue03;
IF sValue02=sValue03 THEN /*如果在key_word中找到存在的值,将值出入对照表中,并将更新idtable中的对应单元*/
INSERT INTO key_contrast(keynum,stuffno) VALUES(sId03,sId02);
UPDATE idtable SET sValue01=sId03+0.1;
ELSE /*如果不在key_word中会去key_word_temp中查找*/
BEGIN
/*定义第四个游标*/
DECLARE vNum04 int default 0 ;
DECLARE sValue04 varchar(100);
DECLARE sValue04_1 varchar(100);
DECLARE sId04 int(36);
DECLARE cur4 CURSOR FOR SELECT keynum,key_word FROM key_word_temp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vNum04=1;
OPEN cur4;
cur4loop:LOOP
FETCH cur4 INTO sId04,sValue04;
IF sValue02=sValue04 THEN /*如果找到会进行同样的插入更新操作*/
INSERT INTO key_contrast(keynum,stuffno) VALUES(sId04+0.1,sId02);
UPDATE idtable SET sValue01=sId04;
ELSE /*如果没有会先插入再查询出来,在进行插入更新*/
INSERT INTO key_word_temp(key_word) VALUES(sValue02);
SELECT keynum into sValue04_1 FROM key_word_temp WHERE key_word=sValue02;
INSERT INTO key_contrast(keynum,stuffno) VALUES(sValue04_1+0.1,sId02);
UPDATE idtable SET sValue01=sId04+0.1;
END IF;
IF vNum04=1 THEN
LEAVE cur4loop;
END IF;
END LOOP cur4loop;
CLOSE cur4; /*第四个游标结束*/
END;
END IF;
IF vNum03=1 THEN
LEAVE cur3loop;
END IF;
END LOOP cur3loop;
CLOSE cur3; /*第三个游标结束*/
END;
IF vNum02=1 THEN
LEAVE cur2loop;
END IF;
END LOOP cur2loop;
CLOSE cur2; /*第二个游标结束*/
END;
IF vNum01=1 THEN
LEAVE cur1loop;
END IF;
END LOOP cur1loop; /*结束第一个游标*/
CLOSE cur1; /*关闭游标*/END /*过程结束*/
$