MySQL 預處理語句prepare、execute、deallocate的使用
MySQL官方將prepare、execute、deallocate統稱為PREPARE STATEMENT。
我習慣稱其為【預處理語句】。
其用法十分簡單,
舉個例子:
使用PAREPARE STATEMENT可以減少每次執行SQL的語法分析,
比如用於執行帶有WHERE條件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改變數值即可。
同樣可以防止SQL隱碼攻擊,引數值可以包含轉義符和定界符。
適用在應用程式中,或者SQL指令碼中均可。
更多用法:
同樣PREPARE ... FROM可以直接接使用者變數:
每一次執行完EXECUTE時,養成好習慣,須執行DEALLOCATE PREPARE … 語句,這樣可以釋放執行中使用的所有資料庫資源(如遊標)。
不僅如此,如果一個session的預處理語句過多,可能會達到max_prepared_stmt_count的上限值。
預處理語句只能在建立者的會話中可以使用,其他會話是無法使用的。
而且在任意方式(正常或非正常)退出會話時,之前定義好的預處理語句將不復存在。
如果在儲存過程中使用,如果不在過程中DEALLOCATE掉,在儲存過程結束之後,該預處理語句仍然會有效。
作者公眾號(持續更新)
我習慣稱其為【預處理語句】。
其用法十分簡單,
-
PREPARE stmt_name FROM preparable_stmt
-
-
EXECUTE stmt_name
-
[USING @var_name [, @var_name] ...] -
-
- {DEALLOCATE | DROP} PREPARE stmt_name
舉個例子:
-
mysql> PREPARE pr1 FROM 'SELECT ?+?';
-
Query OK, 0 rows affected (0.01 sec)
-
Statement prepared
-
-
mysql> SET @a=1, @b=10 ;
-
Query OK, 0 rows affected (0.00 sec)
-
-
mysql> EXECUTE pr1 USING @a, @b;
-
+------+
-
| ?+? |
-
+------+
-
| 11 |
-
+------+
-
1 row in set (0.00 sec)
-
- mysql> EXECUTE pr1 USING 1, 2; -- 只能使用使用者變數傳遞。
- ERROR 1064 (42000): 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 '1, 2' at line 1
-
-
mysql> DEALLOCATE PREPARE pr1;
- Query OK, 0 rows affected (0.00 sec)
使用PAREPARE STATEMENT可以減少每次執行SQL的語法分析,
比如用於執行帶有WHERE條件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改變數值即可。
同樣可以防止SQL隱碼攻擊,引數值可以包含轉義符和定界符。
適用在應用程式中,或者SQL指令碼中均可。
更多用法:
同樣PREPARE ... FROM可以直接接使用者變數:
-
mysql> CREATE TABLE a (a int);
-
Query OK, 0 rows affected (0.26 sec)
-
-
mysql> INSERT INTO a SELECT 1;
-
Query OK, 1 row affected (0.04 sec)
-
Records: 1 Duplicates: 0 Warnings: 0
-
-
mysql> INSERT INTO a SELECT 2;
-
Query OK, 1 row affected (0.04 sec)
-
Records: 1 Duplicates: 0 Warnings: 0
-
-
mysql> INSERT INTO a SELECT 3;
-
Query OK, 1 row affected (0.04 sec)
-
Records: 1 Duplicates: 0 Warnings: 0
-
-
mysql> SET @select_test = CONCAT('SELECT * FROM ', @table_name);
-
Query OK, 0 rows affected (0.00 sec)
-
-
mysql> SET @table_name = 'a';
-
Query OK, 0 rows affected (0.00 sec)
-
-
mysql> PREPARE pr2 FROM @select_test;
-
Query OK, 0 rows affected (0.00 sec)
-
Statement prepared
-
-
mysql> EXECUTE pr2 ;
-
+------+
-
| a |
-
+------+
-
| 1 |
-
| 2 |
-
| 3 |
-
+------+
-
3 rows in set (0.00 sec)
-
-
mysql> DROP PREPARE pr2; -- 此處DROP可以替代DEALLOCATE
- Query OK, 0 rows affected (0.00 sec)
每一次執行完EXECUTE時,養成好習慣,須執行DEALLOCATE PREPARE … 語句,這樣可以釋放執行中使用的所有資料庫資源(如遊標)。
不僅如此,如果一個session的預處理語句過多,可能會達到max_prepared_stmt_count的上限值。
預處理語句只能在建立者的會話中可以使用,其他會話是無法使用的。
而且在任意方式(正常或非正常)退出會話時,之前定義好的預處理語句將不復存在。
如果在儲存過程中使用,如果不在過程中DEALLOCATE掉,在儲存過程結束之後,該預處理語句仍然會有效。
作者公眾號(持續更新)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1852824/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.7 PREPARE、EXECUTE、DEALLOCATE語句介紹MySql
- MySQL 遊標(PREPARE預處理語句)MySql
- Oracle EXECUTE IMMEDIATE語句裡面的引號處理Oracle
- 使用預處理PreparedStatement執行Sql語句SQL
- mysql常用語句及問題處理MySql
- TiDB 原始碼閱讀系列文章(二十三)Prepare/Execute 請求處理TiDB原始碼
- Go 語言操作 MySQL 之 預處理GoMySql
- 快速和慢速的 if 語句:現代處理器的分支預測
- SQL語句的處理過程SQL
- 使用Preprocessor前處理器語句對外部表進行介入處理
- DML 語句處理過程
- 批處理刪除語句
- SQL語句的處理過程修正SQL
- PHP中的PDO操作學習(二)預處理語句及事務PHP
- MySQL中explain語句的使用MySqlAI
- 處理DML語句的幾個階段
- Oracle動態執行語句(Execute Immediate)Oracle
- MySQL在預設事務下各SQL語句使用的鎖分析MySql
- MySQL的語句MySql
- ORACLE 查詢語句處理過程(Oracle
- oracle動態sql語句處理(轉)OracleSQL
- MySQL INSERT IGNORE語句的使用MySql
- MySQL 的CASE WHEN 語句使用說明MySql
- .net 預處理指令符的使用
- Oracle一個SQL語句的處理過程(轉)OracleSQL
- C語言的本質(21)——預處理之三:其它預處理特性及總結C語言
- mysql的常用語句MySql
- mysql語句MySql
- 【轉義】使用SQL生成SQL語句時單引號的轉義處理SQL
- 使用for語句批量註冊事件處理函式程式碼例項事件函式
- MySQL使用profile分析語句效能消耗MySql
- CSS 預處理語言的模組化實踐CSS
- CSS預處理語言的模組化實踐CSS
- MySQL使用Batch批量處理MySqlBAT
- Oracle釋出一個SQL語句的處理過程OracleSQL
- 自然語言處理中的語言模型預訓練方法自然語言處理模型
- mysql如何處理億級資料,第一個階段——優化SQL語句MySql優化
- MySQL 的Rename Table語句MySql