繁体   English   中英

如何用动态表名写一个mysql函数?

[英]How to write a mysql function with dynamic table name?

我正在尝试编写一个我的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 ;

我顺便说一下,选择部分可以正常使用静态表名。

首先,正如@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所提到的那样,虽然这可能会按照您的要求进行,但它可能无法满足您的需求。 如果您可以提供更多信息,那么您可以获得更好的解决方案。

试一试

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'将使用传递的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM