我正在尝试编写一个执行以下操作的 sql 函数: 1- 获取连接中使用的表名作为参数。
但是我得到了 mysql 语法错误
1064 - You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near 'table DETERMINISTIC
BEGIN select `r`.`id` AS `id`, (case ' at line 2
这是我的查询
DELIMITER $$
CREATE FUNCTION getTranslation (tablename varchar(50),entity varchar(20),itemid int,lang char(3))
RETURNS table
DETERMINISTIC
BEGIN
select
`r`.`id` AS `id`,
(case
when isnull(`t`.`descr`) then `r`.`descr_ml`
else `t`.`descr`
end) AS `descr`
from
(tablename `r`
left join `g001_translation` `t` ON ((`t`.`item_id` = `r`.`id`)))
END$$
DELIMITER ;
顺便说一下,我的选择部分可以很好地使用静态表名。
最佳答案
首先,正如@eggyal 所提到的,这不是解决问题的最佳方式。但它可以通过使用准备好的语句来完成。即
DROP PROCEDURE IF EXISTS `exampleOfPrepareStatement`;
CREATE DEFINER = `user`@`%` PROCEDURE `exampleOfPrepareStatement`(inTableName VARCHAR(100))
MODIFIES SQL DATA
SQL SECURITY INVOKER
BEGIN
SET @hr1 = CONCAT('
INSERT INTO `',inTableName,'` (
-- fields (can use parameters same as table name if needed)
)
-- either VALUES () or SELECT here
');
-- Prepare, execute, deallocate
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
END;
您当然可以根据需要添加字段名称等,或者使用 SELECT 或 UPDATE 等。这并不理想,但可以满足您的需求。
在对具有不同字段名称(/表名称)的多个表执行相同维护之前,我不得不在某些地方使用它,因此我没有编写相同的函数 20 次,而是使用这种类型的然后可以调用存储过程来进行索引等。
正如@eggyal 也提到的,虽然这可能会按照您的要求进行,但它可能不会按照您的需要进行。如果您可以提供更多信息,那么您可能会得到更好的解决方案。
关于mysql - 如何用动态表名编写一个mysql函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20945882/