什么MySQL语句在存储过程体中是合法的
生活随笔
收集整理的這篇文章主要介紹了
什么MySQL语句在存储过程体中是合法的
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?什么MySQL語(yǔ)句在存儲(chǔ)過程體中是合法的? 什么樣的SQL語(yǔ)句在Mysql存儲(chǔ)過程中才是合法的呢?你可以創(chuàng)建一個(gè)包含INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的語(yǔ)句。你唯一需要記住的是如果代碼中包含MySQL擴(kuò)充功能,那么代碼將不能移植。在標(biāo)準(zhǔn)SQL語(yǔ)句中:任何數(shù)據(jù)庫(kù)定義語(yǔ)言都是合法的,如:
CREATE PROCEDURE p () DELETE FROM t; // SET、COMMIT以及ROLLBACK也是合法的,如:
CREATE PROCEDURE p () SET @x = 5; //
MySQL的附加功能:任何數(shù)據(jù)操作語(yǔ)言的語(yǔ)句都將合法。
CREATE PROCEDURE p () DROP TABLE t; //
MySQL擴(kuò)充功能:直接的SELECT也是合法的:
CREATE PROCEDURE p () SELECT 'a'; //
順便提一下,我將存儲(chǔ)過程中包括DDL語(yǔ)句的功能稱為MySQL附加功能的原因是在SQL標(biāo)準(zhǔn)中把這個(gè)定義為非核心的,即可選組件。
在過程體中有一個(gè)約束,就是不能有對(duì)例程或表操作的數(shù)據(jù)庫(kù)操作語(yǔ)句。例如下面的例子就是非法的:
CREATE PROCEDURE p1 ()
CREATE PROCEDURE p2 () DELETE FROM t; //
下面這些對(duì)MySQL 5.0來說全新的語(yǔ)句,過程體中是非法的:
CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,
DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER.
不過你可以使用
CREATE PROCEDURE db5.p1 () DROP DATABASE db5//
但是類似
"USE database"
語(yǔ)句也是非法的,因?yàn)镸ySQL假定默認(rèn)數(shù)據(jù)庫(kù)就是過程的工作場(chǎng)所。
Call the Procedure 調(diào)用存儲(chǔ)過程
1.
現(xiàn)在我們就可以調(diào)用一個(gè)存儲(chǔ)過程了,你所需要輸入的全部就是CALL和你過程名以及一個(gè)括號(hào)再一次強(qiáng)調(diào),括號(hào)是必須的當(dāng)你調(diào)用例子里面的p1過程時(shí),結(jié)果是屏幕返回了t表的內(nèi)容
mysql> CALL p1() //
+------+
| s1 |
+------+
| 5 |
+------+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)
因?yàn)檫^程中的語(yǔ)句是
"SELECT * FROM t;" 2. Let me say that again, another way.
其他實(shí)現(xiàn)方式
mysql> CALL p1() //
和下面語(yǔ)句的執(zhí)行效果一樣:
mysql> SELECT * FROM t; //
所以,你調(diào)用p1過程就相當(dāng)于你執(zhí)行了下面語(yǔ)句:
"SELECT * FROM t;"
好了,主要的知識(shí)點(diǎn)"創(chuàng)建和調(diào)用過程方法"已經(jīng)清楚了。我希望你能對(duì)自己說這相當(dāng)簡(jiǎn)單。但是很快我們就有一系列的練習(xí),每次都加一條子句,或者改變已經(jīng)存在的子句。那樣在寫復(fù)雜部件前我們將會(huì)有很多可用的子句。
Characteristics Clauses 特征子句
1.
CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC <--
SQL SECURITY DEFINER <--
COMMENT 'A Procedure' <--
SELECT CURRENT_DATE, RAND() FROM t //
這里我給出的是一些能反映存儲(chǔ)過程特性的子句。子句內(nèi)容在括號(hào)之后,主體之前。這些子句都是可選的,他們有什么作用呢?
2.
CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t //
很好,這個(gè)LANGUAGE SQL子句是沒有作用的。僅是為了說明下面過程的主體使用SQL語(yǔ)言編寫。這條是系統(tǒng)默認(rèn)的,但你在這里聲明是有用的,因?yàn)槟承〥BMS(IBM的DB2)需要它,如果你關(guān)注DB2的兼容問題最好還是用上。此外,今后可能會(huì)出現(xiàn)除SQL外的其他語(yǔ)言支持的存儲(chǔ)過程。
3.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC <--
SQL SECURITY DEFINER
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t //
下一個(gè)子句,NOT DETERMINISTIC,是傳遞給系統(tǒng)的信息。這里一個(gè)確定過程的定義就是那些每次輸入一樣輸出也一樣的程序。在這個(gè)案例中,既然主體中含有SELECT語(yǔ)句,那返回肯定是未知的因此我們稱其NOT DETERMINISTIC。但是MySQL內(nèi)置的優(yōu)化程序不會(huì)注意這個(gè),至少在現(xiàn)在不注意。
4.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER <--
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t // 下一個(gè)子句是SQL SECURITY,可以定義為SQL SECURITY DEFINER或SQL SECURITY INVOKER。
這就進(jìn)入了權(quán)限控制的領(lǐng)域了,當(dāng)然我們?cè)诤竺鎸?huì)有測(cè)試權(quán)限的例子。
SQL SECURITY DEFINER
意味著在調(diào)用時(shí)檢查創(chuàng)建過程用戶的權(quán)限(另一個(gè)選項(xiàng)是SQLSECURITY INVOKER)。
現(xiàn)在而言,使用
SQL SECURITY DEFINER
指令告訴MySQL服務(wù)器檢查創(chuàng)建過程的用戶就可以了,當(dāng)過程已經(jīng)被調(diào)用,就不檢查執(zhí)行調(diào)用過程的用戶了。而另一個(gè)選項(xiàng)(INVOKER)則是告訴服務(wù)器在這一步仍然要檢查調(diào)用者的權(quán)限。
5.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A Procedure' <--
SELECT CURRENT_DATE, RAND() FROM t //
COMMENT 'A procedure'
是一個(gè)可選的注釋說明。
最后,注釋子句會(huì)跟過程定義存儲(chǔ)在一起。這個(gè)沒有固定的標(biāo)準(zhǔn),我在文中會(huì)指出沒有固定標(biāo)準(zhǔn)的語(yǔ)句,不過幸運(yùn)的是這些在我們標(biāo)準(zhǔn)的SQL中很少。
6.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
SELECT CURRENT_DATE, RAND() FROM t //
上面過程跟下面語(yǔ)句是等效的:
CREATE PROCEDURE p2 ()
SELECT CURRENT_DATE, RAND() FROM t //
特征子句也有默認(rèn)值,如果省略了就相當(dāng)于:
LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''
Digressions一些題外話
Digression:
調(diào)用p2()//的結(jié)果
mysql> call p2() //
+--------------+-----------------+
| CURRENT_DATE | RAND() |
+--------------+-----------------+
| 2004-11-09 | 0.7822275075896 |
+--------------+-----------------+
1 row in set (0.26 sec)
Query OK, 0 rows affected (0.26 sec) 當(dāng)調(diào)用過程p2時(shí),一個(gè)SELECT語(yǔ)句被執(zhí)行返回我們期望獲得的隨機(jī)數(shù)。
Digression: sql_mode unchanging
不會(huì)改變的 sql_mode
mysql> set sql_mode='ansi' //
mysql> create procedure p3()select'a'||'b'//
mysql> set sql_mode=''//
mysql> call p3()//
+------------+
| 'a' || 'b' |
+------------+
| ab |
+------------+
MySQL在過程創(chuàng)建時(shí)會(huì)自動(dòng)保持運(yùn)行環(huán)境。例如:我們需要使用兩條豎線來連接字符串但是這只有在sql mode為ansi的時(shí)候才合法。如果我們將sql mode改為non-ansi,不用擔(dān)心,它仍然能工作,只要它第一次使用時(shí)能正常工作。
Exercise 練習(xí)
Question
問題
如果你不介意練習(xí)一下的話,試能否不看后面的答案就能處理這些請(qǐng)求。
創(chuàng)建一個(gè)過程,顯示`Hello world`。用大約5秒時(shí)間去思考這個(gè)問題,既然你已經(jīng)學(xué)到了這里,這個(gè)應(yīng)該很簡(jiǎn)單。當(dāng)你思考問題的時(shí)候,我們?cè)匐S機(jī)選擇一些剛才講過的東西復(fù)習(xí):
DETERMINISTIC
(確定性)子句是反映輸出和輸入依賴特性的子句…調(diào)用過程使用CALL過程名(參數(shù)列表)方式。好了,我猜時(shí)間也到了。
Answer
答案
好的,答案就是在過程體中包含
"SELECT 'Hello, world'" 語(yǔ)句
MySQL
mysql> CREATE PROCEDURE p4 () SELECT 'Hello, world' //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL p4()//
+--------------+
| Hello, world |
+--------------+
| Hello, world |
+--------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec) Parameters 參數(shù)
讓我們更進(jìn)一步的研究怎么在存儲(chǔ)過程中定義參數(shù)
1. CREATE PROCEDURE p5
() ...
2. CREATE PROCEDURE p5
([IN] name data-type) ...
3. CREATE PROCEDURE p5
(OUT name data-type) ...
4. CREATE PROCEDURE p5
(INOUT name data-type) ...
回憶一下前面講過的參數(shù)列表必須在存儲(chǔ)過程名后的括號(hào)中。上面的第一個(gè)例子中的參數(shù)列表是空的,第二個(gè)例子中有一個(gè)輸入?yún)?shù)。這里的詞IN可選,因?yàn)槟J(rèn)參數(shù)為IN(input)。
第三個(gè)例子中有一個(gè)輸出參數(shù),第四個(gè)例子中有一個(gè)參數(shù),既能作為輸入也可以作為輸出。
IN example 輸入的例子
mysql> CREATE PROCEDURE p5(p INT) SET @x = p //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL p5(12345)//
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x//
+-------+
| @x |
+-------+
| 12345 |
+-------+
1 row in set (0.00 sec)
這個(gè)IN的例子演示的是有輸入?yún)?shù)的過程。在過程體中我將會(huì)話變量x設(shè)定為參數(shù)p的值。然后調(diào)用過程,將12345傳入?yún)?shù)p。選擇顯示會(huì)話變量@x,證明我們已經(jīng)將參數(shù)值12345傳入。
OUT example 輸出的例子
mysql> CREATE PROCEDURE p6 (OUT p INT)
-> SET p = -5 //
mysql> CALL p6(@y)//
mysql> SELECT @y//
+------+
| @y |
+------+
| -5 |
+------+
這是另一個(gè)例子。這次的p是輸出參數(shù),然后在過程調(diào)用中將p的值傳入會(huì)話變量@y中。
在過程體中,我們給參數(shù)賦值-5,在調(diào)用后我們可以看出,OUT是告訴DBMS值是從過程中傳出的。
同樣我們可以用語(yǔ)句
"SET @y = -5;"
來達(dá)到同樣的效果
Compound Statements 復(fù)合語(yǔ)句
現(xiàn)在我們展開的詳細(xì)分析一下過程體:
CREATE PROCEDURE p7 ()
BEGIN
SET @a = 5;
SET @b = 5;
INSERT INTO t VALUES (@a);
SELECT s1 * @a FROM t WHERE s1 >= @b;
END; // /* I won't CALL this.
這個(gè)語(yǔ)句將不會(huì)被調(diào)用
*/
完成過程體的構(gòu)造就是BEGIN/END塊。這個(gè)BEGIN/END語(yǔ)句塊和Pascal語(yǔ)言中的BEGIN/END是基本相同的,和C語(yǔ)言的框架是很相似的。我們可以使用塊去封裝多條語(yǔ)句。在這個(gè)例子中,我們使用了多條設(shè)定會(huì)話變量的語(yǔ)句,然后完成了一些insert和select語(yǔ)句。如果你的過程體中有多條語(yǔ)句,那么你就需要BEGIN/END塊了。BEGIN/END塊也被稱為復(fù)合語(yǔ)句,在這里你可以進(jìn)行變量定義和流程控制。
CREATE PROCEDURE p () DELETE FROM t; // SET、COMMIT以及ROLLBACK也是合法的,如:
CREATE PROCEDURE p () SET @x = 5; //
MySQL的附加功能:任何數(shù)據(jù)操作語(yǔ)言的語(yǔ)句都將合法。
CREATE PROCEDURE p () DROP TABLE t; //
MySQL擴(kuò)充功能:直接的SELECT也是合法的:
CREATE PROCEDURE p () SELECT 'a'; //
順便提一下,我將存儲(chǔ)過程中包括DDL語(yǔ)句的功能稱為MySQL附加功能的原因是在SQL標(biāo)準(zhǔn)中把這個(gè)定義為非核心的,即可選組件。
在過程體中有一個(gè)約束,就是不能有對(duì)例程或表操作的數(shù)據(jù)庫(kù)操作語(yǔ)句。例如下面的例子就是非法的:
CREATE PROCEDURE p1 ()
CREATE PROCEDURE p2 () DELETE FROM t; //
下面這些對(duì)MySQL 5.0來說全新的語(yǔ)句,過程體中是非法的:
CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,
DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER.
不過你可以使用
CREATE PROCEDURE db5.p1 () DROP DATABASE db5//
但是類似
"USE database"
語(yǔ)句也是非法的,因?yàn)镸ySQL假定默認(rèn)數(shù)據(jù)庫(kù)就是過程的工作場(chǎng)所。
Call the Procedure 調(diào)用存儲(chǔ)過程
1.
現(xiàn)在我們就可以調(diào)用一個(gè)存儲(chǔ)過程了,你所需要輸入的全部就是CALL和你過程名以及一個(gè)括號(hào)再一次強(qiáng)調(diào),括號(hào)是必須的當(dāng)你調(diào)用例子里面的p1過程時(shí),結(jié)果是屏幕返回了t表的內(nèi)容
mysql> CALL p1() //
+------+
| s1 |
+------+
| 5 |
+------+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)
因?yàn)檫^程中的語(yǔ)句是
"SELECT * FROM t;" 2. Let me say that again, another way.
其他實(shí)現(xiàn)方式
mysql> CALL p1() //
和下面語(yǔ)句的執(zhí)行效果一樣:
mysql> SELECT * FROM t; //
所以,你調(diào)用p1過程就相當(dāng)于你執(zhí)行了下面語(yǔ)句:
"SELECT * FROM t;"
好了,主要的知識(shí)點(diǎn)"創(chuàng)建和調(diào)用過程方法"已經(jīng)清楚了。我希望你能對(duì)自己說這相當(dāng)簡(jiǎn)單。但是很快我們就有一系列的練習(xí),每次都加一條子句,或者改變已經(jīng)存在的子句。那樣在寫復(fù)雜部件前我們將會(huì)有很多可用的子句。
Characteristics Clauses 特征子句
1.
CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC <--
SQL SECURITY DEFINER <--
COMMENT 'A Procedure' <--
SELECT CURRENT_DATE, RAND() FROM t //
這里我給出的是一些能反映存儲(chǔ)過程特性的子句。子句內(nèi)容在括號(hào)之后,主體之前。這些子句都是可選的,他們有什么作用呢?
2.
CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t //
很好,這個(gè)LANGUAGE SQL子句是沒有作用的。僅是為了說明下面過程的主體使用SQL語(yǔ)言編寫。這條是系統(tǒng)默認(rèn)的,但你在這里聲明是有用的,因?yàn)槟承〥BMS(IBM的DB2)需要它,如果你關(guān)注DB2的兼容問題最好還是用上。此外,今后可能會(huì)出現(xiàn)除SQL外的其他語(yǔ)言支持的存儲(chǔ)過程。
3.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC <--
SQL SECURITY DEFINER
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t //
下一個(gè)子句,NOT DETERMINISTIC,是傳遞給系統(tǒng)的信息。這里一個(gè)確定過程的定義就是那些每次輸入一樣輸出也一樣的程序。在這個(gè)案例中,既然主體中含有SELECT語(yǔ)句,那返回肯定是未知的因此我們稱其NOT DETERMINISTIC。但是MySQL內(nèi)置的優(yōu)化程序不會(huì)注意這個(gè),至少在現(xiàn)在不注意。
4.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER <--
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t // 下一個(gè)子句是SQL SECURITY,可以定義為SQL SECURITY DEFINER或SQL SECURITY INVOKER。
這就進(jìn)入了權(quán)限控制的領(lǐng)域了,當(dāng)然我們?cè)诤竺鎸?huì)有測(cè)試權(quán)限的例子。
SQL SECURITY DEFINER
意味著在調(diào)用時(shí)檢查創(chuàng)建過程用戶的權(quán)限(另一個(gè)選項(xiàng)是SQLSECURITY INVOKER)。
現(xiàn)在而言,使用
SQL SECURITY DEFINER
指令告訴MySQL服務(wù)器檢查創(chuàng)建過程的用戶就可以了,當(dāng)過程已經(jīng)被調(diào)用,就不檢查執(zhí)行調(diào)用過程的用戶了。而另一個(gè)選項(xiàng)(INVOKER)則是告訴服務(wù)器在這一步仍然要檢查調(diào)用者的權(quán)限。
5.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A Procedure' <--
SELECT CURRENT_DATE, RAND() FROM t //
COMMENT 'A procedure'
是一個(gè)可選的注釋說明。
最后,注釋子句會(huì)跟過程定義存儲(chǔ)在一起。這個(gè)沒有固定的標(biāo)準(zhǔn),我在文中會(huì)指出沒有固定標(biāo)準(zhǔn)的語(yǔ)句,不過幸運(yùn)的是這些在我們標(biāo)準(zhǔn)的SQL中很少。
6.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
SELECT CURRENT_DATE, RAND() FROM t //
上面過程跟下面語(yǔ)句是等效的:
CREATE PROCEDURE p2 ()
SELECT CURRENT_DATE, RAND() FROM t //
特征子句也有默認(rèn)值,如果省略了就相當(dāng)于:
LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''
Digressions一些題外話
Digression:
調(diào)用p2()//的結(jié)果
mysql> call p2() //
+--------------+-----------------+
| CURRENT_DATE | RAND() |
+--------------+-----------------+
| 2004-11-09 | 0.7822275075896 |
+--------------+-----------------+
1 row in set (0.26 sec)
Query OK, 0 rows affected (0.26 sec) 當(dāng)調(diào)用過程p2時(shí),一個(gè)SELECT語(yǔ)句被執(zhí)行返回我們期望獲得的隨機(jī)數(shù)。
Digression: sql_mode unchanging
不會(huì)改變的 sql_mode
mysql> set sql_mode='ansi' //
mysql> create procedure p3()select'a'||'b'//
mysql> set sql_mode=''//
mysql> call p3()//
+------------+
| 'a' || 'b' |
+------------+
| ab |
+------------+
MySQL在過程創(chuàng)建時(shí)會(huì)自動(dòng)保持運(yùn)行環(huán)境。例如:我們需要使用兩條豎線來連接字符串但是這只有在sql mode為ansi的時(shí)候才合法。如果我們將sql mode改為non-ansi,不用擔(dān)心,它仍然能工作,只要它第一次使用時(shí)能正常工作。
Exercise 練習(xí)
Question
問題
如果你不介意練習(xí)一下的話,試能否不看后面的答案就能處理這些請(qǐng)求。
創(chuàng)建一個(gè)過程,顯示`Hello world`。用大約5秒時(shí)間去思考這個(gè)問題,既然你已經(jīng)學(xué)到了這里,這個(gè)應(yīng)該很簡(jiǎn)單。當(dāng)你思考問題的時(shí)候,我們?cè)匐S機(jī)選擇一些剛才講過的東西復(fù)習(xí):
DETERMINISTIC
(確定性)子句是反映輸出和輸入依賴特性的子句…調(diào)用過程使用CALL過程名(參數(shù)列表)方式。好了,我猜時(shí)間也到了。
Answer
答案
好的,答案就是在過程體中包含
"SELECT 'Hello, world'" 語(yǔ)句
MySQL
mysql> CREATE PROCEDURE p4 () SELECT 'Hello, world' //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL p4()//
+--------------+
| Hello, world |
+--------------+
| Hello, world |
+--------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec) Parameters 參數(shù)
讓我們更進(jìn)一步的研究怎么在存儲(chǔ)過程中定義參數(shù)
1. CREATE PROCEDURE p5
() ...
2. CREATE PROCEDURE p5
([IN] name data-type) ...
3. CREATE PROCEDURE p5
(OUT name data-type) ...
4. CREATE PROCEDURE p5
(INOUT name data-type) ...
回憶一下前面講過的參數(shù)列表必須在存儲(chǔ)過程名后的括號(hào)中。上面的第一個(gè)例子中的參數(shù)列表是空的,第二個(gè)例子中有一個(gè)輸入?yún)?shù)。這里的詞IN可選,因?yàn)槟J(rèn)參數(shù)為IN(input)。
第三個(gè)例子中有一個(gè)輸出參數(shù),第四個(gè)例子中有一個(gè)參數(shù),既能作為輸入也可以作為輸出。
IN example 輸入的例子
mysql> CREATE PROCEDURE p5(p INT) SET @x = p //
Query OK, 0 rows affected (0.00 sec)
mysql> CALL p5(12345)//
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x//
+-------+
| @x |
+-------+
| 12345 |
+-------+
1 row in set (0.00 sec)
這個(gè)IN的例子演示的是有輸入?yún)?shù)的過程。在過程體中我將會(huì)話變量x設(shè)定為參數(shù)p的值。然后調(diào)用過程,將12345傳入?yún)?shù)p。選擇顯示會(huì)話變量@x,證明我們已經(jīng)將參數(shù)值12345傳入。
OUT example 輸出的例子
mysql> CREATE PROCEDURE p6 (OUT p INT)
-> SET p = -5 //
mysql> CALL p6(@y)//
mysql> SELECT @y//
+------+
| @y |
+------+
| -5 |
+------+
這是另一個(gè)例子。這次的p是輸出參數(shù),然后在過程調(diào)用中將p的值傳入會(huì)話變量@y中。
在過程體中,我們給參數(shù)賦值-5,在調(diào)用后我們可以看出,OUT是告訴DBMS值是從過程中傳出的。
同樣我們可以用語(yǔ)句
"SET @y = -5;"
來達(dá)到同樣的效果
Compound Statements 復(fù)合語(yǔ)句
現(xiàn)在我們展開的詳細(xì)分析一下過程體:
CREATE PROCEDURE p7 ()
BEGIN
SET @a = 5;
SET @b = 5;
INSERT INTO t VALUES (@a);
SELECT s1 * @a FROM t WHERE s1 >= @b;
END; // /* I won't CALL this.
這個(gè)語(yǔ)句將不會(huì)被調(diào)用
*/
完成過程體的構(gòu)造就是BEGIN/END塊。這個(gè)BEGIN/END語(yǔ)句塊和Pascal語(yǔ)言中的BEGIN/END是基本相同的,和C語(yǔ)言的框架是很相似的。我們可以使用塊去封裝多條語(yǔ)句。在這個(gè)例子中,我們使用了多條設(shè)定會(huì)話變量的語(yǔ)句,然后完成了一些insert和select語(yǔ)句。如果你的過程體中有多條語(yǔ)句,那么你就需要BEGIN/END塊了。BEGIN/END塊也被稱為復(fù)合語(yǔ)句,在這里你可以進(jìn)行變量定義和流程控制。
轉(zhuǎn)載于:https://blog.51cto.com/wyfirst/225353
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的什么MySQL语句在存储过程体中是合法的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FLEX组件AnyChart实例教程.
- 下一篇: SQL server挂了之后