程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL 5.0 新特性教程 存儲過程:第二講

MySQL 5.0 新特性教程 存儲過程:第二講

編輯:關於MYSQL數據庫
Why MySQL Statements are Legal in a Procedure Body
  什麼MySQL語句在存儲過程體中是合法的?

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

 

CREATE PROCEDURE p () DELETE FROM t; //
  SET、COMMIT以及ROLLBACK也是合法的,如:
CREATE PROCEDURE p () SET @x = 5; //

  MySQL的附加功能:任何數據操作語言的語句都將合法。
CREATE PROCEDURE p () DROP TABLE t; //

  MySQL擴充功能:直接的SELECT也是合法的:
CREATE PROCEDURE p () SELECT 'a'; //

  順便提一下,我將存儲過程中包括DDL語句的功能稱為MySQL附加功能的原因是在SQL標准中把這個定義為非核心的,即可選組件。

  在過程體中有一個約束,就是不能有對例程或表操作的數據庫操作語句。例如下面的例子就是非法的:
CREATE PROCEDURE p1 ()
CREATE PROCEDURE p2 () DELETE FROM t; //

  下面這些對MySQL 5.0來說全新的語句,過程體中是非法的:
CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,
DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER.

  不過你可以使用
CREATE PROCEDURE db5.p1 () DROP DATABASE db5//

  但是類似
"USE database"

  語句也是非法的,因為MySQL假定默認數據庫就是過程的工作場所。

  Call the Procedure 調用存儲過程
  1.
  現在我們就可以調用一個存儲過程了,你所需要輸入的全部就是CALL和你過程名以及一個括號再一次強調,括號是必須的當你調用例子裡面的p1過程時,結果是屏幕返回了t表的內容
MySQL> CALL p1() //
+------+
| s1 |
+------+
| 5 |
+------+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)

  因為過程中的語句是
"SELECT * FROM t;"

  2. Let me say that again, another way.
  其他實現方式
MySQL> CALL p1() //

  和下面語句的執行效果一樣:
MySQL> SELECT * FROM t; //

  所以,你調用p1過程就相當於你執行了下面語句:
"SELECT * FROM t;"

  好了,主要的知識點"創建和調用過程方法"已經清楚了。我希望你能對自己說這相當簡單。但是很快我們就有一系列的練習,每次都加一條子句,或者改變已經存在的子句。那樣在寫復雜部件前我們將會有很多可用的子句。

Characteristics Clauses 特征子句
  1.
CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC <--
SQL SECURITY DEFINER <--
COMMENT 'A Procedure' <--
SELECT CURRENT_DATE, RAND() FROM t //

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

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

  很好,這個LANGUAGE SQL子句是沒有作用的。僅是為了說明下面過程的主體使用SQL語言編寫。這條是系統默認的,但你在這裡聲明是有用的,因為某些DBMS(IBM的DB2)需要它,如果你關注DB2的兼容問題最好還是用上。此外,今後可能會出現除SQL外的其他語言支持的存儲過程。

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

  下一個子句,NOT DETERMINISTIC,是傳遞給系統的信息。這裡一個確定過程的定義就是那些每次輸入一樣輸出也一樣的程序。在這個案例中,既然主體中含有SELECT語句,那返回肯定是未知的因此我們稱其NOT DETERMINISTIC。但是MySQL內置的優化程序不會注意這個,至少在現在不注意。

  4.
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER <--
COMMENT 'A Procedure'
SELECT CURRENT_DATE, RAND() FROM t //
  下一個子句是SQL SECURITY,可以定義為SQL SECURITY DEFINER或SQL SECURITY INVOKER。
  這就進入了權限控制的領域了,當然我們在後面將會有測試權限的例子。
SQL SECURITY DEFINER

  意味著在調用時檢查創建過程用戶的權限(另一個選項是SQLSECURITY INVOKER)。
  現在而言,使用
SQL SECURITY DEFINER

  指令告訴MySQL服務器檢查創建過程的用戶就可以了,當過程已經被調用,就不檢查執行調用過程的用戶了。而另一個選項(INVO

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved