MySQL 用于从 table 中的行读取列的存储函数

MySQL stored function to read column from row in table

我们需要一个函数/存储过程来return table 中一行中的一列,我们将table、id 字段名称、id 和列传递给return.

我们有一个 table,它是一个 activity 日志,其中包含

等列

所以在报告/MySql 语句中,我需要能够列出 log_titlecol 中列名中包含的标题,从 table 中读取log_table 列中的名称,以及 log_idcol.

中任何内容的 ID

很喜欢

SELECT log_titlecol FROM log_table 其中 log_idcol = log_id

所有的'log_;零件是可更换的。我在 MySQL 中看不到这样做的方法,所以有没有办法在存储的 procedure/function 中做到这一点?

例如:

CREATE TABLE jokes (
  JokeID smallint(4) NOT NULL, **(autoincrement, unique)** 
  Title varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  Note text CHARACTER SET utf8
) 

CREATE TABLE idioms (
  IdiomID smallint(4) NOT NULL,  **(autoincrement, unique)**
  IdiomTitle varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  Note text CHARACTER SET utf8
) 

CREATE TABLE `log` (
  id smallint(4) NOT NULL, **(autoincrement, unique)**
  log_datetime datetime,
  log_table varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  log_idcol varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  log_id smallint(4) NOT NULL,
  log_titlecol varchar(50) CHARACTER SET utf8 DEFAULT NULL,
) 


INSERT INTO jokes (Title, Notes) 
VALUES ('Funny joke','This is note1')

INSERT INTO jokes (Title, Notes) 
VALUES ('Another Funny joke','This is another note')

INSERT INTO idioms (IdiomTitle, Notes) 
VALUES ('Bird in the hand','What this means..')

INSERT INTO jokes (Title, Notes) 
VALUES ('Another Funny joke','This is another note')

INSERT INTO log (log_datetime, log_table, log_idcol, log_id , log_titlecol) 
VALUES (now(), 'jokes','JokeID',1,'Title')

INSERT INTO log (log_datetime, log_table, log_idcol, log_id , log_titlecol) 
VALUES (now(), 'jokes','JokeID',2,'Title')

INSERT INTO log (log_datetime, log_table, log_idcol, log_id , log_titlecol) 
VALUES (now(), 'idioms','IdiomID',2,'IdiomTitle')

那么现在我怎样才能从日志中获得一份报告,显示笑话 table 中的日期时间和标题列,log_id 列中的行 ID?我需要一个功能。

例如 SELECT log_datetime, log_table, log_id, GetTitle(log_table, log_idcol, log_id, log_titlecol) 来自日志

其中 GetTitle 是一个函数,它将 return 保存在 'log_titlecol' 中的列形成作为 log_table 传递的 table,来自具有 id 的行(保存在log_id

的 log_idcol 列)

因此,例如输出将显示:

2018-01-01 12:00 jokes 1 Funny Joke 2018-01-01 12:10 jokes 2 Another Funny joke 2018-01-01 12:11 idioms 1 Bird in the hand

我试过了

 CREATE PROCEDURE Getcol(IN tab TEXT CHARSET utf8mb4, IN col TEXT CHARSET utf8mb4, IN idcol TEXT CHARSET utf8mb4, IN id INT(15), OUT outcol TEXT CHARSET utf8mb4)
 DETERMINISTIC
 COMMENT 'Return a column from any table'
 BEGIN
     SET @Expression = CONCAT('SELECT ', col,' INTO @outcol FROM ', tab, ' where ', idcol, ' = ', id); 
     PREPARE myquery FROM @Expression; 
     EXECUTE myquery; 
     SELECT @outcol;
 END

我可以这样称呼它 CALL GetCol('Jokes','Title','JokeID',1)

这适用于 return ID 1 的标题列,但我似乎无法将此调用放入函数中

 CREATE FUNCTION getrowcol(tab TEXT, col TEXT, idcol TEXT, id INT) RETURNS text CHARSET utf8mb4
     NO SQL
   COMMENT 'Return a column from any table'
   BEGIN
        DECLARE outvar TEXT;
        CALL GetCol(tab, col, idcol, id, @out1);
        SELECT @out1 INTO outvar;
        RETURN outvar;
   END

这个return是空白的。我怎样才能 return @out1?

这基本上是同一个问题(没有答案)

https://dba.stackexchange.com/questions/151328/dynamic-sql-stored-procedure-called-by-a-function

尝试类似的东西,

DELIMITER //

CREATE PROCEDURE demo(tab VARCHAR(50), tit VARCHAR(50))
BEGIN  
    SET @Expression = CONCAT('SELECT l.log_datetime, j.',tit,' FROM `log` l INNER JOIN ',tab,' j;');
    PREPARE myquery FROM @Expression;
    EXECUTE myquery;

END 
//

DELIMITER ;

这样称呼

CALL demo('jokes', 'title')

来自 Reference