日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql实现动态查询_mysql 实现动态查询

發布時間:2024/9/19 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql实现动态查询_mysql 实现动态查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從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`;

總結

以上是生活随笔為你收集整理的mysql实现动态查询_mysql 实现动态查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。