MySQL-mysql中自定义函数中create tabel出现问题?

MySQL-mysql中自定义函数中create tabel出现问题?

浮生未歇 发布于 2017-06-13 字数 1010 浏览 1214 回复 2

在mysql中写了一个函数,用来自动创建表,编译时提示:[Err] 1422 - Explicit or implicit commit is not allowed in stored function or trigger.高手是怎解决的?支个招吧!

DELIMITER $$
DROP FUNCTION IF EXISTS `my_create_table`$$

CREATE FUNCTION `my_create_table`(in_name varchar(20), in_total integer) RETURNS integer
BEGIN
DECLARE _index INTEGER DEFAULT 0;
DECLARE _tableName VARCHAR(20) DEFAULT '';

label: LOOP
IF _index < in_total THEN
SET _tableName=CONCAT(in_name,_index);
CREATE TABLE _tableName (
`id` bigint(20) NOT NULL DEFAULT '0',
`nickname` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SET _index = _index+1;
ITERATE label;
END IF;
LEAVE label;
END LOOP label;
RETURN _index;
END $$;
DELIMITER ;

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泛泛之交 2017-10-10 2 楼

已经解决了。的确是在函数和触发器中不能写create table中DDL语句。改为下面的代码就OK了。

CREATE PROCEDURE `my_create_table`(in_name varchar(20), in_total integer)
BEGIN
DECLARE _index INTEGER DEFAULT 0;
DECLARE _sql VARCHAR(255);

label: LOOP
IF _index < in_total THEN

SET _sql = CONCAT('CREATE TABLE `', in_name,'_',_index,'` (
`id` bigint(20) NOT NULL DEFAULT '0',
`name` varchar(255) DEFAULT NULL,
`add_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;');
SELECT _sql;
SET @sql = _sql;
PREPARE s FROM @sql;
EXECUTE s;
DEALLOCATE PREPARE s;

SET _index = _index+1;
ITERATE label;
END IF;
LEAVE label;
END LOOP label;

END

夜无邪 2017-09-06 1 楼

1.储函数中不能使用显式或隐式的commit or rollback。
2.但存储过程中可以使用。
3.具体看mysql 手册。

For stored functions (but not stored procedures), the following additional statements or operations are not permitted:
•Statements that perform explicit or implicit commit or rollback. Support for these statements is not required by the SQL standard, which states that each DBMS vendor may decide whether to permit them.