代码之家  ›  专栏  ›  技术社区  ›  Brian Boatright

如何在MySQL存储过程中使用动态SQL

  •  73
  • Brian Boatright  · 技术社区  · 16 年前

    如何在MySQL存储过程中构建和使用动态sql?

    3 回复  |  直到 16 年前
        1
  •  119
  •   TimoSolo Horshack    11 年前

    5.0.13之后,在存储过程中,可以使用动态SQL:

    delimiter // 
    CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
    BEGIN
        SET @s = CONCAT('SELECT ',col,' FROM ',tbl );
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END
    //
    delimiter ;
    

    动态SQL在函数或触发器中不起作用。看见 the MySQL documentation 更多用途。

        2
  •  56
  •   Jonny Jason Stevenson    4 年前

    我不相信MySQL支持动态sql。你可以做类似但不同的“准备好的”陈述。

    以下是一个示例:

    mysql> PREPARE stmt FROM 
        -> 'select count(*) 
        -> from information_schema.schemata 
        -> where schema_name = ? or schema_name = ?'
    ;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    mysql> EXECUTE stmt 
        -> USING @schema1,@schema2
    +----------+
    | count(*) |
    +----------+
    |        2 |
    +----------+
    1 row in set (0.00 sec)
    mysql> DEALLOCATE PREPARE stmt;
    

    准备好的语句通常用于查看给定查询的执行计划。因为他们被处决了 执行 命令和 SQL语言 可以分配给一个变量,您可以近似动态sql的一些相同行为。

    这是一个很好的 link 关于这个:

    别忘了取消分配 stmt 使用最后一行!

    祝你好运

        3
  •  4
  •   Elcio    9 年前

    您可以使用用户定义变量在动态语句外传递

    Server version: 5.6.25-log MySQL Community Server (GPL)
    
    mysql> PREPARE stmt FROM 'select "AAAA" into @a';
    Query OK, 0 rows affected (0.01 sec)
    Statement prepared
    
    mysql> EXECUTE stmt;
    Query OK, 1 row affected (0.01 sec)
    
    DEALLOCATE prepare stmt;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select @a;
    +------+
    | @a   |
    +------+
    |AAAA  |
    +------+
    1 row in set (0.01 sec)