1. 程式人生 > >MySQL儲存過程中使用動態SQL與靜態SQL的區別

MySQL儲存過程中使用動態SQL與靜態SQL的區別

儲存過程中使用動態SQL 例項

[sql] view plain copy
print?

DELIMITER $$  


DROP PROCEDURE IF EXISTS `test`.`t1`$$  
CREATE  
    /** [DEFINER = { user | CURRENT_USER }]*/  
    PROCEDURE `test`.`t1`()  
    /*LANGUAGE SQL  
    | [NOT] DETERMINISTIC  
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  
    | SQL SECURITY { DEFINER | INVOKER }  
    | COMMENT 'string'  


    */  
    BEGIN  

        SET @i = 3;  
        SET @j = 5;  

        -- 設立動態SQL  
        SET @SQL = 'select * from `t1` limit ?,?';  

        -- 載入動態SQL  
        PREPARE STMT FROM @SQL;  

        -- 執行動態SQL  
        EXECUTE STMT USING @i,@j;  

    END$$  


DELIMITER ;  

儲存過程中未使用動態SQL 例項,靜態sql 的limit 的變數必須是用decare 宣告的才行

[sql] view plain copy
print?

DELIMITER $$  

DROP PROCEDURE IF EXISTS `test`.`t2`$$  
CREATE  
    /** [DEFINER = { user | CURRENT_USER }]*/  
    PROCEDURE `test`.`t2`()  
    /*LANGUAGE SQL  
    | [NOT] DETERMINISTIC  
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  
    | SQL SECURITY { DEFINER | INVOKER }  
    | COMMENT 'string'  

    */  
    BEGIN  

    -- 如果不使用動態SQL,那麼變數必須通過declare進行定義,才能在select語句中使用。  
    DECLARE i INT DEFAULT 0;  
    DECLARE j INT DEFAULT 0;  
    SET i = 3;  
    SET j = 5;  
    SELECT * FROM t1 LIMIT i,j;  

    END$$  

DELIMITER ;  

如果不定義,會報如下錯誤:

[html] view plain copy
print?

DELIMITER $$  

DROP PROCEDURE IF EXISTS `test`.`t3`$$  
CREATE  
    /** [DEFINER = { user | CURRENT_USER }]*/  
    PROCEDURE `test`.`t3`()  
    /*LANGUAGE SQL  
    | [NOT] DETERMINISTIC  
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  
    | SQL SECURITY { DEFINER | INVOKER }  
    | COMMENT 'string'  


        SET @i = 3;  
        SET @j = 5;  
        SET @sql = 'select * from `t1` limit ?,?';  
        PREPARE STMT FROM @sql;  
        EXECUTE STMT USING @i,@j;  
    */  
    BEGIN  
    SET @i = 3;  
    SET @j = 5;  
    SELECT * FROM t1 LIMIT @i,@j;  
    END$$  

DELIMITER ;  

執行後,報錯如下:

(0 row(s) affected, 1 warning(s))
Execution Time : 00:00:00:281
Transfer Time : 00:00:01:045
Total Time : 00:00:01:326

Error Code : 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 ‘@i,@j;
END’ at line 18

Execution Time : 00:00:00:000
Transfer Time : 00:00:00:000
Total Time : 00:00:00:000