【MySQL】PREPARE 的應用

簡單的用set或者declare語句定義變量,然后直接作為sql的表名是不行的,mysql會把變量名當作表名。在其他的sql數據庫中也是如此,mssql的解決方法是將整條sql語句作為變量,其中穿插變量作為表名,然后用sp_executesql調用該語句。

這在mysql5.0之前是不行的,5.0之后引入了一個全新的語句,可以達到類似sp_executesql的功能(僅對procedure有效,function不支持動態查詢):

PREPARE stmt_name FROM preparable_stmt; 
EXECUTE stmt_name [USING @var_name [, @var_name] ...]; 
{DEALLOCATE | DROP} PREPARE stmt_name; 

為了有一個感性的認識,?

下面先給幾個小例子:

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?,tmt_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?句法被支持。
I:?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`; 

了解了PREPARE的用法,再用變量做表名就很容易了。不過在實際操作過程中還發現其他一些問題,比如變量定義,declare變量和set?@var=value變量的用法以及參數傳入的變量。?

測試后發現,set?@var=value這樣定義的變量直接寫在字符串中就會被當作變量轉換,declare的變量和參數傳入的變量則必須用CONCAT來連接。具體的原理沒有研究。
EXECUTE?stmt?USING?@a;這樣的語句USING后面的變量也只能用set?@var=value這種,declare和參數傳入的變量不行。

?

轉載于:https://www.cnblogs.com/mqxs/p/6019422.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457040.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡歷要求中“ 扎實的JAVA基礎”的學習方法

最近在頭條看到一篇關于Java基礎學習的文章,感覺寫的很不錯,分享一下,希望對大家有幫助 什么東西算作Java基礎?學到什么程度才算扎實? 這些問題的答案,LZ已經用文言文告訴你了,咳咳,…

C++11 tuple的使用

多少分轉載于:https://www.cnblogs.com/DswCnblog/p/6524832.html

c語言程序設計貪吃蛇需求分析,C語言編程新手入門基礎進階學習!貪吃蛇小游戲演示和說明...

C語言是面向過程的,而C++是面向對象的設計貪吃蛇游戲的主要目的是讓大家夯實C語言基礎,訓練編程思維,培養解決問題的思路,領略多姿多彩的C語言。游戲開始后,會在中間位置出現一條只有三個節點的…

解決bash: mysql: command not found 的方法【linux mysql命令 】

linux下,在mysql正常運行的情況下,輸入mysql提示: mysql command not found 遇上-bash: mysql: command not found的情況別著急,這個是因為/usr/local/bin目錄下缺失mysql導致,只需要以下方法即可以解決: …

堆和棧的區別(經典干貨)

一、預備知識—程序的內存分配 一個由C/C編譯的程序占用的內存分為以下幾個部分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其 操作方式類似于 數據結構 中的棧。 2、堆區(he…

Strus2中關于ValueStack詳解

什么是ValueStack 它是一個接口com.opensymphony.xwork2.util.ValueStack。我們使用它是將其做為一個容器,用于攜帶action數據到頁面。在頁面上通過ognl表達式獲取數據。 valueStack主要是將action數據攜帶到頁面上,通過ognl獲取數據 1.ValueStack有一個…

Airbnb React/JSX 編碼規范

Airbnb React/JSX 編碼規范算是最合理的React/JSX編碼規范之一了內容目錄基本規范Class vs React.createClass vs stateless命名聲明模塊代碼對齊單引號還是雙引號空格屬性Refs引用括號標簽函數/方法模塊生命周期isMountedBasic Rules 基本規范每個文件只寫一個模塊.但是多個無…

Mysql數據庫使用總結

mysql數據庫使用總結 本文主要記錄一些mysql日常使用的命令,供以后查詢。 1.更改root密碼 mysqladmin -uroot password yourpassword 2.遠程登陸mysql服務器 mysql -uroot -p -h192.168.137.10 -P3306 3.查詢數據庫 show databases; 4.進入某個數據庫 use databa…

c語言遞歸漢諾塔次數,漢諾塔問題(C語言經典遞歸問題(一))

把A桿上的金盤全部移到C桿上,并仍保持原有順序疊好。操作規則:每次只能移動一個盤子,并且在移動過程中三根桿上都始終保持大盤在下,小盤在上,操作過程中盤子可以置于A、B、C任一桿上。思路:圖解&#xff1a…

Eclipes導入的項目中的中文都是亂碼的解決辦法

把項目導入Eclipse時,里邊的中文全是亂碼,試了很多方法,最終總結一下! eclipse之所以會出現亂碼問題是因為eclipse編輯器選擇的編碼規則是可變的。一般默認都是UTF-8或者GBK,當從外部導入的一個工程時,如果…

理解瀏覽器是如何加載及渲染網頁的

先上圖,我們再慢慢解釋,這圖就是瀏覽器加載網頁的一個過程 當我們在瀏覽器輸入一個地址(比如:http://toadw.cn),那么點擊回車后,瀏覽器是如何加載網頁的呢? 加載過程 一開始瀏覽器是不知道你輸入的http://t…

CentOS下的Mysql的安裝和使用

1.使用安裝命令 :yum -y install mysql mysql-server mysql-devel 安裝完成卻發現Myserver安裝缺失,在網上找原因,原來是因為CentOS 7上把MySQL從默認軟件列表中移除了,用MariaDB來代替,所以這導致我們必須要去官網上…

NOIP模擬題——神秘大門

【題目描述】最近小K大牛經過調查發現,在WZland的最南方——WZ Antarctica 出現了奇怪的磁場反應。為了弄清楚這一現象,小K 大牛親自出馬,來到了WZ Antarctica。小K大牛發現WZ Antarctica 出現了一道神秘的大門。人總有好奇心,小K…

大學c語言程序設計大賽,關于舉辦寧夏大學第二屆C語言程序設計大賽的通知

各學院:根據學校《關于進一步加強基礎課教學改革的意見》(寧大校發〔2008〕178號)、《關于加強學生創新精神和創新能力培養的實施意見》(寧大校發〔2008〕75號)的有關文件精神,經研究決定舉辦寧夏大學第二屆C語言程序設計大賽,從中選拔出優秀…

Android中創建自己的對話框

Activities提供了一種方便管理的創建、保存、回復的對話框機制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用這些方法的話,Activity將通過getOwnerActivity()方法返回該Act…

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11

搭建Django2.0Python3MySQL5時同步數據庫時報錯: django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None 解決辦法: 找到Python安裝路勁下的Python36-32\Lib\site-packages\django\db\backend…

一件很好笑的事情

我是一個比較習慣努力學習的人, 我也會去學習各種可能與我有交集的知識, 就在這幾天,我看到以前的一個android網絡培訓學校開辦了C/C的培訓,這是挺好的事, 但是看他們的文件,我就奇怪了。 這份文件&#xf…

c語言實現循環鏈表,c語言實現循環鏈表的基本操作

循環鏈表和單鏈表其實區別不大,差別僅在于算法中的循環條件不是p或者p->next,而是是否等于頭指針。下面這個例子簡單的實現了循環鏈表的基本操作,其中插入和刪除只是完成了主要的部分,沒有判斷。#include#includestruct Data{char name;int age;};struct CirList{Data *data…

關于Eclipes的Logcat無法打印消息的解決辦法

轉自:http://blog.csdn.net/harry211/article/details/8453532 調試程序需要打印一些消息出來,logcat不好用的話就很麻煩了。這個問題折騰了好久,為啥就是不出來呢? 上網找了很多解決辦法: 重啟eclipse 重啟adb 重啟…

17:文字排版

17:文字排版 查看提交統計提問總時間限制: 1000ms內存限制: 65536kB描述給一段英文短文,單詞之間以空格分隔(每個單詞包括其前后緊鄰的標點符號)。請將短文重新排版,要求如下: 每行不超過80個字符;每個單詞…