我正在尝试编写一个我的sql函数,执行以下操作: 1-获取join中使用的表名作为参数。
但是我得到了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 ;
顺便说一句,我选择部分可以正常使用静态表名。
答案 0 :(得分:2)
首先,正如@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所提到的那样,虽然这可能会按照您的要求进行,但它可能无法满足您的需求。如果您可以提供更多信息,那么您可以获得更好的解决方案。
答案 1 :(得分:1)
试一试
SET @ex = CONCAT('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`)));');
PREPARE stmt FROM @ex;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
您会注意到',tablename'将使用传递的参数。