天天看點

mysql 5.5 declare,MySQL5新語句declare的用法

新SQL語句,在複合語句中聲明變量的指令是DECLARE。 (1) Example with two DECLARE statements兩個DECLARE語句的例子CREATE PROCEDURE p8 ()BEGINDECLARE a INT;DECLARE b INT;SET a = 5;SET b = 5;INSERT INTO t VALUES (a);SELECT s1 * a FROM t WHERE s1 >=

新SQL語句,在複合語句中聲明變量的指令是DECLARE。(1) Example with two DECLARE statements

兩個DECLARE語句的例子

CREATE PROCEDURE p8 ()

BEGIN

DECLARE a INT;

DECLARE b INT;

SET a = 5;

SET b = 5;

INSERT INTO t VALUES (a);

SELECT s1 * a FROM t WHERE s1 >= b;

END; // 在過程中定義的變量并不是真正的定義,你隻是在BEGIN/END塊内定義了而已(譯注:也就是形參)。注意這些變量和會話變量不一樣,不能使用修飾符@你必須清楚的在BEGIN/END塊中聲明變量和它們的類型。變量一旦聲明,你就能在任何能使用會話變量、文字、列名的地方使用。(2)Example with no DEFAULT clause and SET statement

沒有預設子句和設定語句的例子

CREATE PROCEDURE p9 ()

BEGIN

DECLARE a INT ;

DECLARE b INT ;

SET a = 5;

SET b = 5;

INSERT INTO t VALUES (a);

SELECT s1 * a FROM t WHERE s1 >= b;

END; // 有很多初始化變量的方法。如果沒有預設的子句,那麼變量的初始值為NULL。你可以在任何時候使用SET語句給變量指派。(3)Example with DEFAULT clause

含有DEFAULT子句的例子

CREATE PROCEDURE p10 ()

BEGIN

DECLARE a, b INT DEFAULT 5;

INSERT INTO t VALUES (a);

SELECT s1 * a FROM t WHERE s1 >= b;

END; //我們在這裡做了一些改變,但是結果還是一樣的。在這裡使用了DEFAULT子句來設定初始值,這就不需要把DECLARE和SET語句的實作分開了。 (4)Example of CALL

調用的例子

mysql> CALL p10() //

+--------+

| s1 * a |

+--------+

| 25 |

| 25 |

+--------+

2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)結果顯示了過程能正常工作

(5) Scope

作用域

CREATE PROCEDURE p11 ()

BEGIN

DECLARE x1 CHAR(5) DEFAULT 'outer';

BEGIN

DECLARE x1 CHAR(5) DEFAULT 'inner';

SELECT x1;

END;

SELECT x1;

END; //現在我們來讨論一下作用域的問題。例子中有嵌套的BEGIN/END塊,當然這是合法的。同時包含兩個變量,名字都是x1,這樣也是合法的。内部的變量在其作用域内享有更高的優先權。當執行到END語句時,内部變量消失,此時已經在其作用域外,變量不再可見了,是以在存儲過程外再也不能找到這個聲明了的變量,但是你可以通過OUT參數或者将其值指派 給會話變量來儲存其值。 調用作用域例子的過程:

mysql> CALL p11()//

+-------+

| x1 |

+-------+

| inner |

+-------+

+-------+

| x1 |

+-------+

| outer |

+-------+我們看到的結果時第一個SELECT語句檢索到最内層的變量,第二個檢索到第二層的變量。