我正试图让一个函数从任何作为参数给定的表中创建一个新的ID。
DROP FUNCTION IF EXISTS create_id;
DELIMITER $$
CREATE FUNCTION create_id(db_table TEXT,pkey TEXT,strlen INT,joinner TEXT)
RETURNS TEXT
BEGIN
DECLARE max_id TEXT;
DECLARE new_id TEXT;
SET max_id = (SELECT MAX(pkey) FROM db_table);
SET new_id = max_id;
RETURN new_id;
END;
$$
DELIMITER ;
感谢您的回答
您不能随心所欲地使用变量;基本上,如果您想要一个变量标识符(表名、列名等(,则需要使用动态SQL。但是MySQL函数不支持动态SQL。因此,您需要使用具有OUT
参数的过程。
考虑:
drop procedure if exists create_id;
delimiter $$
create procedure create_id(in _db_table text, in _pkey text, out _max_id int)
begin
set @max_id = null;
set @sql = concat('select max(`', _pkey, '`) into @max_id from `', _db_table, '`');
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
set _max_id = @max_id;
end;
$$
delimiter ;
然后,您调用该过程并恢复out值,如下所示:
call create_id('mytable', 'id', @max_id);
select @max_id;
注意:我看不出原始函数的最后两个参数有什么意义,所以我删除了它们。