欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
MySQL5.0新特性教程存儲過(guò)程:第二講
Why MySQL Statements are Legal in a Procedure Body
   什么MySQL語(yǔ)句在存儲過(guò)程體中是合法的?

  什么樣的SQL語(yǔ)句在Mysql存儲過(guò)程中才是合法的呢?你可以創(chuàng )建一個(gè)包含INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的語(yǔ)句。你唯一需要記住的是如果代碼中包含MySQL擴充功能,那么代碼將不能移植。在標準SQL語(yǔ)句中:任何數據庫定義語(yǔ)言都是合法的,如:

CREATE PROCEDURE p () DELETE FROM t; //

  SET、COMMIT以及ROLLBACK也是合法的,如:

CREATE PROCEDURE p () SET @x = 5; //


  MySQL的附加功能:任何數據操作語(yǔ)言的語(yǔ)句都將合法。

CREATE PROCEDURE p () DROP TABLE t; //


  MySQL擴充功能:直接的SELECT也是合法的:

CREATE PROCEDURE p () SELECT ‘a(chǎn)‘; //


  順便提一下,我將存儲過(guò)程中包括DDL語(yǔ)句的功能稱(chēng)為MySQL附加功能的原因是在SQL標準中把這個(gè)定義為非核心的,即可選組件。

在過(guò)程體中有一個(gè)約束,就是不能有對例程或表操作的數據庫操作語(yǔ)句。例如下面的例子就是非法的:

CREATE PROCEDURE p1 ()
CREATE PROCEDURE p2 () DELETE FROM t; //


  下面這些對MySQL 5.0來(lái)說(shuō)全新的語(yǔ)句,過(guò)程體中是非法的:

CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,
DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER.


  不過(guò)你可以使用

CREATE PROCEDURE db5.p1 () DROP DATABASE db5//


  但是類(lèi)似

"USE database"


  語(yǔ)句也是非法的,因為MySQL假定默認數據庫就是過(guò)程的工作場(chǎng)所。

  Call the Procedure 調用存儲過(guò)程
  1.
  現在我們就可以調用一個(gè)存儲過(guò)程了,你所需要輸入的全部就是CALL和你過(guò)程名以及一個(gè)括號再一次強調,括號是必須的當你調用例子里面的p1過(guò)程時(shí),結果是屏幕返回了t表的內容

mysql> CALL p1() //
+------+
| s1 |
+------+
| 5 |
+------+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)


  因為過(guò)程中的語(yǔ)句是

"SELECT * FROM t;"

 2. Let me say that again, another way.
   其他實(shí)現方式

mysql> CALL p1() //


  和下面語(yǔ)句的執行效果一樣:

mysql> SELECT * FROM t; //


  所以,你調用p1過(guò)程就相當于你執行了下面語(yǔ)句:

"SELECT * FROM t;"


  好了,主要的知識點(diǎn)"創(chuàng )建和調用過(guò)程方法"已經(jīng)清楚了。我希望你能對自己說(shuō)這相當簡(jiǎn)單。但是很快我們就有一系列的練習,每次都加一條子句,或者改變已經(jīng)存在的子句。那樣在寫(xiě)復雜部件前我們將會(huì )有很多可用的子句。
 
 
 
 
Characteristics Clauses 特征子句
  1.

 

CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC <--
SQL SECURITY DEFINER <--
COMMENT ‘A Procedure‘ <--
SELECT CURRENT_DATE, RAND() FROM t //


  這里我給出的是一些能反映存儲過(guò)程特性的子句。子句內容在括號之后,主體之前。這些子句都是可選的,他們有什么作用呢?

  2.

CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ‘A Procedure‘
SELECT CURRENT_DATE, RAND() FROM t //


  很好,這個(gè)LANGUAGE SQL子句是沒(méi)有作用的。僅是為了說(shuō)明下面過(guò)程的主體使用SQL語(yǔ)言編寫(xiě)。這條是系統默認的,但你在這里聲明是有用的,因為某些DBMS(IBM的DB2)需要它,如果你關(guān)注DB2的兼容問(wèn)題最好還是用上。此外,今后可能會(huì )出現除SQL外的其他語(yǔ)言支持的存儲過(guò)程。
 3.

CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC <--
SQL SECURITY DEFINER
COMMENT ‘A Procedure‘
SELECT CURRENT_DATE, RAND() FROM t //


  下一個(gè)子句,NOT DETERMINISTIC,是傳遞給系統的信息。這里一個(gè)確定過(guò)程的定義就是那些每次輸入一樣輸出也一樣的程序。在這個(gè)案例中,既然主體中含有SELECT語(yǔ)句,那返回肯定是未知的因此我們稱(chēng)其N(xiāo)OT DETERMINISTIC。但是MySQL內置的優(yōu)化程序不會(huì )注意這個(gè),至少在現在不注意。

  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)入了權限控制的領(lǐng)域了,當然我們在后面將會(huì )有測試權限的例子。

SQL SECURITY DEFINER


  意味著(zhù)在調用時(shí)檢查創(chuàng )建過(guò)程用戶(hù)的權限(另一個(gè)選項是SQLSECURITY INVOKER)。
  現在而言,使用

SQL SECURITY DEFINER


  指令告訴MySQL服務(wù)器檢查創(chuàng )建過(guò)程的用戶(hù)就可以了,當過(guò)程已經(jīng)被調用,就不檢查執行調用過(guò)程的用戶(hù)了。而另一個(gè)選項(INVOKER)則是告訴服務(wù)器在這一步仍然要檢查調用者的權限。

  5.

CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ‘A Procedure‘ <--
SELECT CURRENT_DATE, RAND() FROM t //


  COMMENT ‘A procedure‘
  是一個(gè)可選的注釋說(shuō)明。
最后,注釋子句會(huì )跟過(guò)程定義存儲在一起。這個(gè)沒(méi)有固定的標準,我在文中會(huì )指出沒(méi)有固定標準的語(yǔ)句,不過(guò)幸運的是這些在我們標準的SQL中很少。

  6.

CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ‘‘
SELECT CURRENT_DATE, RAND() FROM t //


  上面過(guò)程跟下面語(yǔ)句是等效的:
CREATE PROCEDURE p2 ()
SELECT CURRENT_DATE, RAND() FROM t //
 
特征子句也有默認值,如果省略了就相當于:
LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ‘‘
 
 
 
 

Digressions一些題外話(huà)

  Digression:
  調用p2()//的結果

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)

  當調用過(guò)程p2時(shí),一個(gè)SELECT語(yǔ)句被執行返回我們期望獲得的隨機數。
   Digression: sql_mode unchanging
   不會(huì )改變的

sql_mode
mysql> set sql_mode=‘a(chǎn)nsi‘ //
mysql> create procedure p3()select‘a(chǎn)‘||‘b‘//
mysql> set sql_mode=‘‘//
mysql> call p3()//
+------------+
| ‘a(chǎn)‘ || ‘b‘ |
+------------+
| ab |
+------------+


  MySQL在過(guò)程創(chuàng )建時(shí)會(huì )自動(dòng)保持運行環(huán)境。例如:我們需要使用兩條豎線(xiàn)來(lái)連接字符串但是這只有在sql mode為ansi的時(shí)候才合法。如果我們將sql mode改為non-ansi,不用擔心,它仍然能工作,只要它第一次使用時(shí)能正常工作。

Exercise 練習

  Question
  問(wèn)題
  如果你不介意練習一下的話(huà),試能否不看后面的答案就能處理這些請求。
  創(chuàng )建一個(gè)過(guò)程,顯示`Hello world`。用大約5秒時(shí)間去思考這個(gè)問(wèn)題,既然你已經(jīng)學(xué)到了這里,這個(gè)應該很簡(jiǎn)單。當你思考問(wèn)題的時(shí)候,我們再隨機選擇一些剛才講過(guò)的東西復習:
  DETERMINISTIC
 ?。ù_定性)子句是反映輸出和輸入依賴(lài)特性的子句…調用過(guò)程使用CALL過(guò)程名(參數列表)方式。好了,我猜時(shí)間也到了。

  Answer
  答案
  好的,答案就是在過(guò)程體中包含

"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 參數

  讓我們更進(jìn)一步的研究怎么在存儲過(guò)程中定義參數
  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) ...


  回憶一下前面講過(guò)的參數列表必須在存儲過(guò)程名后的括號中。上面的第一個(gè)例子中的參數列表是空的,第二個(gè)例子中有一個(gè)輸入參數。這里的詞IN可選,因為默認參數為IN(input)。

  第三個(gè)例子中有一個(gè)輸出參數,第四個(gè)例子中有一個(gè)參數,既能作為輸入也可以作為輸出。
  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的例子演示的是有輸入參數的過(guò)程。在過(guò)程體中我將會(huì )話(huà)變量x設定為參數p的值。然后調用過(guò)程,將12345傳入參數p。選擇顯示會(huì )話(huà)變量@x,證明我們已經(jīng)將參數值12345傳入。
  OUT example 輸出的例子

mysql> CREATE PROCEDURE p6 (OUT p INT)
-> SET p = -5 //
mysql> CALL p6(@y)//
mysql> SELECT @y//
+------+
| @y |
+------+
| -5 |
+------+


  這是另一個(gè)例子。這次的p是輸出參數,然后在過(guò)程調用中將p的值傳入會(huì )話(huà)變量@y中。
在過(guò)程體中,我們給參數賦值-5,在調用后我們可以看出,OUT是告訴DBMS值是從過(guò)程中傳出的。
  同樣我們可以用語(yǔ)句

"SET @y = -5;"


  來(lái)達到同樣的效果

Compound Statements 復合語(yǔ)句

  現在我們展開(kāi)的詳細分析一下過(guò)程體:

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ì )被調用
*/


   完成過(guò)程體的構造就是BEGIN/END塊。這個(gè)BEGIN/END語(yǔ)句塊和Pascal語(yǔ)言中的BEGIN/END是基本相同的,和C語(yǔ)言的框架是很相似的。我們可以使用塊去封裝多條語(yǔ)句。在這個(gè)例子中,我們使用了多條設定會(huì )話(huà)變量的語(yǔ)句,然后完成了一些insert和select語(yǔ)句。如果你的過(guò)程體中有多條語(yǔ)句,那么你就需要BEGIN/END塊了。BEGIN/END塊也被稱(chēng)為復合語(yǔ)句,在這里你可以進(jìn)行變量定義和流程控制。

  未完待續...

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MySQL 存儲過(guò)程和函數
MySQL中的存儲過(guò)程和函數
MySQL 錯誤1418 的原因分析及解決方法
Informix存儲過(guò)程 詳解
MySql 存儲過(guò)程實(shí)例(附完整注釋)
新手MySQL工程師必備命令速查手冊
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久