zoukankan      html  css  js  c++  java
  • [轉]mysql limit后的变量问题,sql语句的prepare

    FROM : http://www.dangkai.com/ArticlePage/Article65764.htm

    例子:

    CREATE PROCEDURE PROC_NAME(IN a INT, IN bINT)

    BEGIN
        DECLARE sql1VARCHAR(100);
        SET sql1 ="SELECT*FROM uw_player_skill LIMIT ?,?";
        SET@fvar =a;
        SET@svar =b;
        SET@SQUERY =sql1;
        PREPARE STMTFROM @SQUERY;
        EXECUTE STMTUSING @fvar,@svar;
    END

     

    说明:

     

    从MySQL 5.0 开始,
    支持了一个全新的SQL句法:

    PREPARE stmt_name FROM preparable_stmt ;

    EXECUTE stmt_name [USING@var_name [,@var_name ]...];

    {DEALLOCATE | DROP} PREPARE stmt_name ;

     

    通过它,我们就可以实现类似 MS SQL 的 sp_executesql 执行动态SQL语句!
    同时也可以防止注入式攻击!

    为 了有一个感性的认识,
    下面先给几个小例子:

    mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';mysql> SET @a = 3;mysql> SET @b = 4;mysql> EXECUTE stmt1 USING @a, @b;+------------+| hypotenuse |+------------+|          5 |+------------+mysql> DEALLOCATE PREPARE stmt1;
    mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';mysql> PREPARE stmt2 FROM @s;mysql> SET @a = 6;mysql> SET @b = 8;mysql> EXECUTE stmt2 USING @a, @b;+------------+| hypotenuse |+------------+|         10 |+------------+mysql> DEALLOCATE PREPARE stmt2;
     
    
    
    如果你的MySQL 版本是 5.0.7 或者更高的,你还可以在 LIMIT 子句中使用它,示例如下:
    
    
    mysql> SET @a=1;
    mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
    mysql> EXECUTE STMT USING @a;

     
     
    mysql> SET @skip=1; SET @numrows=5;mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";mysql> EXECUTE STMT USING @skip, @numrows;
    
    
     
    
    
    使用 PREPARE 的几个注意点:A: PREPARE stmt_name FROM preparable_stmt; 预定义一个语句,并将它赋给 stmt_name stmt_name 是不区分大小写的。B: 即使 preparable_stmt 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。C: 如果新的 PREPARE 语句使用了一个已存在的 stmt_name ,那么原有的将被立即释放! 即使这个新的 PREPARE 语句因为错误而不能被正确执行。
    
    
    D: PREPARE stmt_name 的作用域是当前客户端连接会话可见。E: 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。
    
    
    F:
    
    
     EXECUTE stmt_name 句法中,如果 stmt_name 不存在,将会引发一个错误。 
    
    
    G:
    
    
     如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。H:
    
    
     在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。
    
    
    G:
    
    
     PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用! 
    
    
    下面给个示例:
    
    
     
    
    
    CREATE PROCEDURE `p1`(IN id INT UNSIGNED,IN name VARCHAR(11))BEGIN  lable_exit: BEGIN    SET @SqlCmd = 'SELECT * FROM tA ';    IF id IS NOT NULL THEN
    
    
             SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE id=?');         PREPARE stmt FROM @SqlCmd;         SET @a = id;         EXECUTE stmt USING @a;         LEAVE lable_exit;    END IF;    IF name IS NOT NULL THEN         SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE name LIKE ?');         PREPARE stmt FROM @SqlCmd;         SET @a = CONCAT(name, '%');         EXECUTE stmt USING @a;         LEAVE lable_exit;        END IF;  END lable_exit;END;
    CALL `p1`(1,NULL);CALL `p1`(NULL,'QQ');
    
    
    DROP PROCEDURE `p1`;
  • 相关阅读:
    现代软件工程 第一章 概论 第3题——韩婧
    现代软件工程 第一章 概论 第2题——韩婧
    小组成员邓琨、白文俊、张星星、韩婧
    UVa 10892 LCM的个数 (GCD和LCM 质因数分解)
    UVa 10780 幂和阶乘 求n!中某个因子的个数
    UVa 11859 除法游戏(Nim游戏,质因子)
    Codeforces 703C Chris and Road 二分、思考
    Codeforces 703D Mishka and Interesting sum 树状数组
    hdu 5795 A Simple Nim SG函数(多校)
    hdu 5793 A Boring Question 推公式(多校)
  • 原文地址:https://www.cnblogs.com/Athrun/p/2120825.html
Copyright © 2011-2022 走看看