Mysql儲存過程 二

2021-08-24 18:45:11 字數 4131 閱讀 8684

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來說全新的語句,過程體中是非法的?lt;br>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() //

characteristics clauses 特徵子句

4.create procedure p2 ()

language sql

not deterministic

sql security definer <--

comment 'a procedure'

select current_date, rand() from t //

5.create procedure p2 ()

language sql

not deterministic

sql security definer

comment 'a procedure' <--

select current_date, rand() from t //

comment 'a procedure'

是乙個可選的注釋說明。

最後,注釋子句會跟過程定義儲存在一起。這個沒有固定的標準,我在文中會指出沒有固定標準的語句,不過幸運的是這些在我們標準的sql中很少。

6.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一些題外話

exercise 練習

question

問題如果你不介意練習一下的話,試能否不看後面的答案就能處理這些請求。

建立乙個過程,顯示`hello world`。用大約5秒時間去思考這個問題,既然你已經學到了這裡,這個應該很簡單。當你思考問題的時候,我們再隨機選擇一些剛才講過的東西複習:

deterministic

(確定性)子句是反映輸出和輸入依賴特性的子句…呼叫過程使用call過程名(引數列表)方式。好了,我猜時間也到了。

answer

答案好的,答案就是在過程體中包含

"select 'hello, world'"

語句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 引數

讓我們更進一步的研究怎麼在儲存過程中定義引數

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) ...

回憶一下前面講過的引數列表必須在儲存過程名後的括號中。上面的第乙個例子中的引數列表是空的,第二個例子中有乙個輸入引數。這裡的詞in可選,因為預設引數為in(input)。

在過程體中,我們給引數賦值-5,在呼叫後我們可以看出,out是告訴dbms值是從過程中傳出的。

同樣我們可以用語句

"set @y = -5;".

來達到同樣的效果

compound statements 復合語句

現在我們展開的詳細分析一下過程體:

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.

這個語句將不會被呼叫

*/完 成過程體的構造就是begin/end塊。這個begin/end語句塊和pascal語言中的begin/end是基本相同的,和c語言的框架是很相似 的。我們可以使用塊去封裝多條語句。在這個例子中,我們使用了多條設定會話變數的語句,然後完成了一些insert和select語句。如果你的過程體中 有多條語句,那麼你就需要begin/end塊了。begin/end塊也被稱為復合語句,在這裡你可以進行變數定義和流程控制。

mysql 《二》儲存過程

create procedure 過程名 in out inout 引數名 資料型別 in out inout 引數名 資料型別 begin 過程體delimiter create procedure testpro out s int begin select count into s from ...

MySQL的儲存過程(二)

characteristic特徵值 1 language sql 說明下面過程的body是適用sql語言編寫,這條是系統預設的,為今後mysql會支援的除sql外的其他語言支援的儲存過程而準備。3 這些特徵值提供子程式使用資料的內在資訊,這些特徵值目前只是提供給伺服器,並沒有根據這些特徵值來約束過程...

mysql儲存過程 MySQL儲存過程

在本節中,您將逐步學習如何在mysql中編寫和開發儲存過程。首先,我們向您介紹儲存過程的概念,並討論何時使用它。然後,展示如何使用過程 的基本元素,如建立儲存過程的語句,if else,case,loop,儲存過程的引數。下面每個教程都包含了易於理解的示例和詳細的說明。如果您瀏覽並學習所有教程,您可...