什么樣的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; //
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í)現(xiàn)方式
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一些題外話
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=‘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 參數(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)
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ì)被調(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)行變量定義和流程控制。
未完待續(xù)...
聯(lián)系客服