什么樣的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; //
CREATE PROCEDURE p () SET @x = 5; //
CREATE PROCEDURE p () DROP TABLE t; //
CREATE PROCEDURE p () SELECT ‘a(chǎn)‘; //
CREATE PROCEDURE p1 ()
CREATE PROCEDURE p2 () DELETE FROM t; //
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 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. 其他實(shí)現方式
mysql> CALL p1() //
mysql> SELECT * FROM t; //
"SELECT * FROM t;"
CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC <--
SQL SECURITY DEFINER <--
COMMENT ‘A Procedure‘ <--
SELECT CURRENT_DATE, RAND() FROM t //
CREATE PROCEDURE p2 ()
LANGUAGE SQL <--
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ‘A Procedure‘
SELECT CURRENT_DATE, RAND() FROM t //
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC <--
SQL SECURITY DEFINER
COMMENT ‘A Procedure‘
SELECT CURRENT_DATE, RAND() FROM t //
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER <--
COMMENT ‘A Procedure‘
SELECT CURRENT_DATE, RAND() FROM t //
SQL SECURITY DEFINER
SQL SECURITY DEFINER
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ‘A Procedure‘ <--
SELECT CURRENT_DATE, RAND() FROM t //
CREATE PROCEDURE p2 ()
LANGUAGE SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ‘‘
SELECT CURRENT_DATE, RAND() FROM t //
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 |
+------------+
"SELECT ‘Hello, world‘"
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)
mysql> CREATE PROCEDURE p6 (OUT p INT)
-> SET p = -5 //
mysql> CALL p6(@y)//
mysql> SELECT @y//
+------+
| @y |
+------+
| -5 |
+------+
"SET @y = -5;"
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)行變量定義和流程控制。
未完待續...
聯(lián)系客服