【问题标题】:MySQL: How creating a function that queries with variables columns namesMySQL:如何创建一个使用变量列名查询的函数
【发布时间】:2021-02-14 22:59:00
【问题描述】:

我正在尝试创建一个函数,该函数可以从作为参数给出的任何表中创建一个新 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 ;

感谢您的回答

【问题讨论】:

  • 这是一个真的,非常糟糕的主意。如果您有多个事务这样做,它根本无法正常工作。

标签: mysql sql stored-procedures dynamic-sql sql-function


【解决方案1】:

您不能随意使用变量;基本上,如果你想要一个变量标识符(表名、列名等),你需要使用动态 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 ;

然后,您调用该过程并恢复输出值,如下所示:

call create_id('mytable', 'id', @max_id);
select @max_id;

注意:我看不到原始函数的最后两个参数的意义,所以我删除了它们。

【讨论】:

  • 我可以在另一个过程定义中调用这个新过程吗?
  • 感谢您的帮助。请问,我可以在另一个过程定义中调用这个新过程吗?
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2018-05-29
  • 2020-04-15
  • 2013-03-25
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
相关资源
最近更新 更多