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

标签 mysql sql dynamic-sql

我正在尝试编写一个执行以下操作的 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/

相关文章:

python - 简单的 Python 方法需要永远执行/运行

Postgresql动态游标(用于EXECUTE中的记录),字段访问

sql - 尝试创建大型动态查询时,不断被截断

php - 使用 PHP 在 HTML 表中显示图像 [path] 和数据 [Varchar]

java - 如何识别哪个字段导致异常

php - 打开新页面,其中包含上一页的表格数据

mysql - Perl sql 全选

sql - 基于IF的SQL查询?

sql-server - 动态 SQL 命令未执行

php - 如何在数据库中保存用户的位置