gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:25:14 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com