MySQL預先處理語句

來源:互聯網
上載者:User

標籤:

預製語句的SQL文法基於三個SQL語句:

        PREPARE stmt_name FROM preparable_stmt;

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

        {DEALLOCATE | DROP} PREPARE stmt_name;

PREPARE語句用於預備一個語句,並賦予它名稱stmt_name,藉此在以後引用該語句。

先行編譯SQL的存活期就是當前的會話,也就是當前的資料庫連接。如果串連一斷開 ,那就會消失。

例:

mysql> desc tb;

+-------+------------------+------+-----+---------+----------------+

| Field | Type             | Null | Key | Default | Extra          |

+-------+------------------+------+-----+---------+----------------+

| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |

| Name  | char(20)         | NO   |     | NULL    |                |

| Age   | tinyint(4)       | NO   |     | NULL    |                |

+-------+------------------+------+-----+---------+----------------+

3 rows in set (0.08 sec)

 

mysql> PREPARE prod FROM "INSERT INTO tb VALUES(?,?,?)";

Query OK, 0 rows affected (0.58 sec)

Statement prepared

 

mysql> PREPARE prod FROM "INSERT INTO tb(name,age) VALUES(?,?)";

Query OK, 0 rows affected (0.00 sec)

Statement prepared

 

mysql> set @p=‘tejevo‘;

Query OK, 0 rows affected (0.06 sec)

 

mysql> set @q=20;

Query OK, 0 rows affected (0.00 sec)

 

mysql> execute prod using @p, @q;

Query OK, 1 row affected (0.05 sec)

 

mysql> select * from tb;

+----+--------+-----+

| id | Name   | Age |

+----+--------+-----+

|  1 | tejevo |  20 |

+----+--------+-----+

1 row in set (0.00 sec)

 

mysql> deallocate prepare prod;

 

說明:from後面跟的就是要進行編譯的那個SQL,這個值可以是一個字面的字串值 ,就像上面,也可以是一個變數。比如:

            set @sql = ‘select * from tb‘;

            prepare pstmt from @sql;  

from後面跟的只能是字面值或者變數這兩種情況 ,不能直接跟十六進位的字串。

被編譯的SQL只能是一條單獨的語句,不能多條語句一起編譯,比如:

             prepare mutisql from ‘select 1;select 2‘;  --- 這是錯誤的

調用的時候利用using關鍵字向SQL傳遞參數 。

              set @value = 1;execute pstmt using @value;  

先聲明一個變數來儲存參數的值,然後通過後面的using @value來傳SQL傳遞參數 。
注意這裡的參數的值只能由變數來傳遞,不能直接寫成execute pstmt using 1; 這是錯誤的。
多個參數之間用逗號隔開。

 

使用 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:可以被先行編譯的SQL語句的型也是有限制的,並不是所有的SQL都可以被編譯。在預定義語句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支援。
I:PREPARE 語句不可以用於預存程序(5.0以上可以使用),自訂函數!但從 MySQL 5.0.13 開始,它可以被用於預存程序,仍不支援在函數或觸發器中使用!

MySQL預先處理語句

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.