【问题标题】:Create dynamic stored procedure in mysql with table name only在mysql中只用表名创建动态存储过程
【发布时间】:2017-02-18 12:03:19
【问题描述】:

我正在尝试仅为表名创建一个动态存储过程,我的意思是当我以表名作为参数调用存储过程时,它应该显示给定表名的所有详细信息。

我正在使用此代码:-

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM '",tab_name,"' ");
PREPARE stmt3 FROM @t1;
EXECUTE stmt3;
DEALLOCATE PREPARE stmt3;
END

显示错误,错误是:-

MySQL 说:文档

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 '' 附近使用正确的语法

任何人都可以帮助我。

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    反引号包围表格名称。

    DROP PROCEDURE IF EXISTS `test1`;
    DELIMITER $$
    CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40))
    BEGIN
        SET @t1 =CONCAT("SELECT * FROM `",tab_name,"`"); -- back-ticks around tbl name
        PREPARE stmt3 FROM @t1;
        EXECUTE stmt3;
        DEALLOCATE PREPARE stmt3;
    END$$
    DELIMITER ;
    

    或(PHPMyAdmin 或不需要分隔符的):

    DROP PROCEDURE IF EXISTS `test1`;
    CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40))
    BEGIN
        SET @t1 =CONCAT("SELECT * FROM `",tab_name,"`"); -- back-ticks around tbl name
        PREPARE stmt3 FROM @t1;
        EXECUTE stmt3;
        DEALLOCATE PREPARE stmt3;
    END
    

    希望你能用这个存储过程做一些不同的事情,因为它看起来微不足道,而且比仅仅调用 select 慢。

    【讨论】:

    • 感谢 Drew,我正在更改您提供的一些代码,它工作正常。再次感谢您的帮助我正在使用 CREATE PROCEDURE test1(IN tab_name VARCHAR(40)) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN SET @t1 =CONCAT("SELECT * FROM ",tab_name,"");从@t1 准备 stmt3;执行 stmt3;解除分配准备stmt3;结束
    • 酷。很高兴听到昆瓦尔。
    • 是的,我知道你上面的意思。反勾号在评论中被歪曲了。需要像一个转义序列一样让它显示出来。但是,是的,反引号。
    • FROM `",tab_name,"`"); ...所以在反引号之前只是一个斜线(在 cmets 中,而不是在你的真实代码中!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多