MySQL存储函数从表

时间:2018-03-29 16:53:51

标签: mysql stored-procedures stored-functions

我们需要一个函数/存储过程来返回表中一行的列,我们传递表,id字段名,id和列以返回。

我们有一个表,它是一个活动日志,其中包含

等列
  • log_datetime - 用户执行某项操作的日期/时间

  • log_table - 受影响的表格

  • log_idcol - 包含id

  • 的log_table中的列
  • log_id - log_table

  • 中行的ID
  • log_titlecol - log_table中包含'标题'的列。的 项目

因此,在report / MySql语句中,我需要能够列出log_titlecol中保存的列名中的标题,从log_table列中的名称读取表,以及log_idcol中的任何ID。

所以喜欢

SELECT log_titlecol FROM log_table,其中log_idcol = log_id

所有' log_;零件是可更换的。我无法在MySQL中看到这样做的方法,那么有没有办法在存储过程/函数中执行此操作?

例如:

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')

那么现在如何从日志中显示日期时间的报告和Jokes表中的Title列,log id在log_id列中?我需要一个功能。

例如,从日志中选择log_datetime,log_table,log_id,GetTitle(log_table,log_idcol,log_id,log_titlecol)

其中GetTitle是一个函数,它将返回' log_titlecol'中保存的列。从log_id

的id(在log_idcol列中保存)的行中形成以log_table形式传递的表

因此,例如输出将显示:

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)

这可以返回ID 1的Title列,但我似乎无法将此调用放入函数中

 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

返回空白。我该如何退回@ out1?

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

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

1 个答案:

答案 0 :(得分:0)

尝试类似的事情,

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