【问题标题】:How to send table name as Mysql Store procedure如何将表名作为 Mysql 存储过程发送
【发布时间】:2011-07-07 13:38:48
【问题描述】:

我写了一个存储过程。但它不将表名作为参数。现在我如何将表名作为参数发送。请在下面查看我的过程:

DELIMITER $$
USE `db_test`$$
DROP PROCEDURE IF EXISTS `test_proc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test_proc`(IN newsInfoTable VARCHAR(100))
BEGIN              
    SELECT news INTO @news
    FROM newsInfoTable
    WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d') 
    ORDER BY date_time DESC LIMIT 1;
    SELECT @news;
 END$$
DELIMITER ;

调用参数:

USE db_test;
CALL test_proc('tbl_news_list');

但错误是:表 'db_test.newsinfotable' 不存在

如何解决这个问题。请帮忙。

【问题讨论】:

  • 你已经问过这个问题,它已经被回答并且你接受了答案,这个问题与:stackoverflow.com/questions/6609778/… 有什么不同
  • 亲爱的约翰,谢谢你的关心(char) 使用 date_time 函数时。所以我想要一个更好的解决方案。希望你撤回你的反对票。
  • 查看这个问题和重复以及接受的答案,这是一个真正的重复,因为您没有在这个问题中包含来自接受的答案的任何信息。您的最新问题:stackoverflow.com/questions/6612530/… 确实使用了正确的做事方式,所以这不是重复的。

标签: mysql stored-procedures


【解决方案1】:

在您的过程主体中使用prepared statements

SET @s = CONCAT('SELECT ... FROM ', newsInfoTable);
PREPARE stmt FROM @s;
EXECUTE stmt;
//.....
DEALLOCATE PREPARE stmt;

您的代码应如下所示:

SET @sql_stam = CONCAT('SELECT news INTO @news FROM ',newsInfoTable,  
 ' WHERE DATE_FORMAT(date_time,\'%Y-%m-%d\') 
ORDER BY date_time DESC LIMIT 1');
...
SELECT @news;

另外,我看不出您需要使用 @news 变量的任何理由...

【讨论】:

  • 谢谢。但是当我在我的准备语句中使用 DATE_FORMAT(date_time,'%Y-%m-%d') 时,'(sign) 出现错误。那么,我现在该怎么办? ?
  • 亲爱的@a1ex07:谢谢你的时间。我写了一个过程。它执行正确,但在调用过程时出现错误:错误代码:1327 未声明的变量:第三。请查看我的过程并给我解决方案:DELIMITER $$ USE db_dailystar$$ DROP PROCEDURE IF EXISTS test_proc$$ CREATE DEFINER=root@localhost PROCEDURE test_proc(IN newsInfoTable VARCHAR(100)) BEGIN SET @sql_stam = CONCAT( 'SELECT news INTO ', @news,' FROM ',newsInfoTable,' WHERE ',CURDATE(),'=?;');从@sql_stam 准备s1; SET @where_param = DATE_FORMAT(date_time,'%Y-%m-%d');可执行文件
  • @riad:你最好更新你的问题。很难在评论中阅读您的代码。
  • 请查看我的问题:stackoverflow.com/questions/6612530/…
  • 亲爱的@a1ex07:非常感谢您抽出宝贵时间,请在stackoverflow.com/questions/6612530/… 上查看我的问题,我有信心您可以帮助解决问题。所以请帮助。我使用您更新的问题,但得到错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'select @news; 附近使用的正确语法; END' 在第 9 行
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
相关资源
最近更新 更多