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

时间:2014-01-06 08:29:13

标签: mysql sql dynamic-sql

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

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

2 个答案:

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