MySQL 用于从 table 中的行读取列的存储函数
MySQL stored function to read column from row in table
我们需要一个函数/存储过程来return table 中一行中的一列,我们将table、id 字段名称、id 和列传递给return.
我们有一个 table,它是一个 activity 日志,其中包含
等列
log_datetime - date/time 用户做了某事
log_table - table 受影响
log_idcol - log_table 中包含 id
的列
log_id - log_table
中行的 ID
log_titlecol - log_table 中包含 'title' 的列
项目
所以在报告/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
我们需要一个函数/存储过程来return table 中一行中的一列,我们将table、id 字段名称、id 和列传递给return.
我们有一个 table,它是一个 activity 日志,其中包含
等列log_datetime - date/time 用户做了某事
log_table - table 受影响
log_idcol - log_table 中包含 id
的列
log_id - log_table
中行的 ID
log_titlecol - log_table 中包含 'title' 的列 项目
所以在报告/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