mysql存儲過程基本語法
mysql存儲過程的基本用法有哪些
在外部程序訪問資料庫時(例如 PHP),要組織很多 SQL 語句。
特別是業務邏輯復雜的時候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而慄。現在有了 MySQL 存儲過程,業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高。
一、MySQL 創建存儲過程
"pr_add" 是個簡單的 MySQL 存儲過程,這個MySQL 存儲過程有兩個 int 類型的輸入參數 "a"、"b",返回這兩個參數的和。
復制代碼 代碼如下:
drop procere if exists pr_add;
計算兩個數之和
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
select c as sum;
/*
return c;
不能在 MySQL 存儲過程中使用。return 只能出現在函數中。
*/
end;
二、調用 MySQL 存儲過程
復制代碼 代碼如下:
call pr_add(10, 20);
執行 MySQL 存儲過程,存儲過程參數為 MySQL 用戶變數。
復制代碼 代碼如下:
set @a = 10;
set @b = 20;
call pr_add(@a, @b);
三、MySQL 存儲過程特點
創建 MySQL 存儲過程的簡單語法為:
復制代碼 代碼如下:
create procere 存儲過程名字()
(
[in|out|inout] 參數 datatype
)
begin
MySQL 語句;
end;
MySQL 存儲過程參數如果不顯式指定"in"、"out"、"inout",則默認為"in"。習慣上,對於是"in" 的參數,我們都不會顯式指定。
1. MySQL 存儲過程名字後面的"()"是必須的,即使沒有一個參數,也需要"()"
2. MySQL 存儲過程參數,不能在參數名稱前加"@",如:"@a int"。下面的創建存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程中的變數,不需要在變數名字前加"@",雖然 MySQL 客戶端用戶變數要加個"@"。
復制代碼 代碼如下:
create procere pr_add
(
@a int, -- 錯誤
b int -- 正確
)
3. MySQL 存儲過程的參數不能指定默認值。
4. MySQL 存儲過程不需要在 procere body 前面加 "as"。而 SQL Server 存儲過程必須加 "as" 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
as -- 錯誤,MySQL 不需要 "as"
begin
mysql statement ...;
end;
5. 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;
6. MySQL 存儲過程中的每條語句的末尾,都要加上分號 ";"
復制代碼 代碼如下:
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;
7. MySQL 存儲過程中的注釋。
復制代碼 代碼如下:
/*
這是個
多行 MySQL 注釋。
*/
declare c int; -- 這是單行 MySQL 注釋 (注意 -- 後至少要有一個空格)
if a is null then # 這也是個單行 MySQL 注釋
set a = 0;
end if;
『貳』 mysql 存儲過程總結(二)if語句、參數
1、if :用於做條件判斷,具體的語法結構為:
在if條件判斷的結構中,ELSE IF 結構可以有多個,也可以沒有。 ELSE結構可以有,也可以沒有。
案列:
根據定義的分數score變數,判定當前分數對應的分數等級。
score >= 90分,等級為優秀。
score >= 80分,等級為良好
score >= 60分,等級為及格
score < 60分,等級為不及格。
上述的需求我們雖然已經實現了,但是也存在一些問題,比如:score 分數我們是在存儲過程中定義 死的,而且最終計算出來的分數等級,我們也僅僅是最終查詢展示出來而已。
那麼我們能不能,把score分數動態的傳遞進來,計算出來的分數等級是否可以作為返回值返回呢? 答案是肯定的,我們可以通過接下來所講解的 參數 來解決上述的問題。
2、參數的類型
主要分為以下三種:IN、OUT、INOUT。 具體的含義如下:
(1)in :該類參數作為輸入,也就是需要調用時傳入值 默認
(2)out:該類參數作為輸出,也就是該參數可以作為返回值
(3)inout:既可以作為輸入參數,也可以作為輸出參數
用法:
案例一:
案列二:
『叄』 mysql存儲過程怎麼寫
MySQL 存儲過程是一些 SQL 語句的集合,比如有的時候我們可能需要一大串的 SQL 語句,或者說在編寫 SQL 語句的過程中還需要設置一些變數的值,這個時候我們就完全有必要編寫一個存儲過程。下面我們來介紹一下如何創建一個存儲過程。
語法格式:
可以使用 CREATE PROCEDURE 語句創建存儲過程。
語法格式如下:
CREATE PROCEDURE <過程名> ( [過程參數[,?] ] ) <過程體>
[過程參數[,?] ] 格式
[ IN | OUT | INOUT ] <參數名> <類型>語法說明如下:
1) 過程名
存儲過程的名稱,默認在當前資料庫中創建。若需要在特定資料庫中創建存儲過程,則要在名稱前面加上資料庫的名稱,即 db_name.sp_name。需要注意的是,名稱應當盡量避免選取與 MySQL 內置函數相同的名稱,否則會發生錯誤。
2) 過程參數
存儲過程的參數列表。其中,<參數名>為參數名,<類型>為參數的類型(可以是任何有效的 MySQL 數據類型)。當有多個參數時,參數列表中彼此間用逗號分隔。存儲過程可以沒有參數(此時存儲過程的名稱後仍需加上一對括弧),也可以有 1 個或多個參數。
MySQL 存儲過程支持三種類型的參數,即輸入參數、輸出參數和輸入/輸出參數,分別用 IN、OUT 和 INOUT 三個關鍵字標識。其中,輸入參數可以傳遞給一個存儲過程,輸出參數用於存儲過程需要返回一個操作結果的情形,而輸入/輸出參數既可以充當輸入參數也可以充當輸出參數。需要注意的是,參數的取名不要與數據表的列名相同,否則盡管不會返回出錯信息,但是存儲過程的 SQL 語句會將參數名看作列名,從而引發不可預知的結果。
3) 過程體
存儲過程的主體部分,也稱為存儲過程體,包含在過程調用的時候必須執行的 SQL 語句。這個部分以關鍵字 BEGIN 開始,以關鍵字 END 結束。若存儲過程體中只有一條 SQL 語句,則可以省略 BEGIN-END 標志。
在存儲過程的創建中,經常會用到一個十分重要的 MySQL 命令,即 DELIMITER 命令,特別是對於通過命令行的方式來操作 MySQL 資料庫的使用者,更是要學會使用該命令。
在 MySQL 中,伺服器處理 SQL 語句默認是以分號作為語句結束標志的。然而,在創建存儲過程時,存儲過程體可能包含有多條 SQL 語句,這些 SQL 語句如果仍以分號作為語句結束符,那麼 MySQL 伺服器在處理時會以遇到的第一條 SQL 語句結尾處的分號作為整個程序的結束符,而不再去處理存儲過程體中後面的 SQL 語句,這樣顯然不行。為解決這個問題,通常可使用 DELIMITER 命令將結束命令修改為其他字元。
語法格式如下:
DELIMITER $$語法說明如下:$$ 是用戶定義的結束符,通常這個符號可以是一些特殊的符號,如兩個「?」或兩個「¥」等。當使用 DELIMITER 命令時,應該避免使用反斜杠「」字元,因為它是 MySQL 的轉義字元。
在 MySQL 命令行客戶端輸入如下SQL語句。
mysql > DELIMITER ??成功執行這條 SQL 語句後,任何命令、語句或程序的結束標志就換為兩個問號「??」了。
若希望換回默認的分號「;」作為結束標志,則在 MySQL 命令行客戶端輸入下列語句即可:
mysql > DELIMITER ;注意:DELIMITER 和分號「;」之間一定要有一個空格。在創建存儲過程時,必須具有 CREATE ROUTINE 許可權。可以使用 SHOW PROCEDURE STATUS 命令查看資料庫中存在哪些存儲過程,若要查看某個存儲過程的具體信息,則可以使用 SHOW CREATE PROCEDURE <存儲過程名>。
創建不帶參數的存儲過程
存儲過程的作用是從學生成績信息表中查詢學生的成績信息,輸入的 SQL 語句和執行過程如下所示。
mysql> DELIMITER //
mysql> CREATE PROCEDURE ShowStuScore()
-> BEGIN
-> SELECT * FROM tb_students_score;
-> END //
Query OK, 0 rows affected (0.09 sec)
『肆』 mysql存儲過程語法和oracle的區別
在查詢分頁時,Oracle使用偽列rownum,而MySQL則採用limit關鍵字。這是兩種資料庫管理系統在處理分頁查詢時的主要區別之一。
Oracle在語法要求上更為嚴格,特別是在變數使用方面,它提供了更多的數據類型,包括number類型和大數據類型,而MySQL則沒有這些類型。
在數據插入方面,Oracle不允許為空列插入數據,而MySQL則可以接受。這在數據完整性方面可能會帶來一些差異。
對於日期轉換函數,Oracle使用to_date('要轉的字元串','格式'),例如:select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from al;而MySQL則使用str_to_date('08/09/2008', '%m/%d/%Y'),結果為2008-08-09。這兩種方法都是用於將字元串轉換為日期格式。
對於主鍵自增的需求,Oracle無法直接設置列自增,而MySQL則可以。如果需要實現類似的功能,Oracle可以通過序列加觸發器的方式來達到目的。
總的來說,大約90%的SQL語句在兩種資料庫系統中的語法是相同的。不過,Oracle在格式上的要求更為嚴格,有時在插入某些字元型數據時需要加上單引號。
在插入日期數據時,MySQL可以直接插入成功,而Oracle則需要先將日期數據轉換為資料庫內部的日期類型。從安全性角度來看,Oracle更為安全,但價格也更昂貴,通常只有大型企業會使用。
此外,Oracle還提供了存儲過程和函數、觸發器等高級功能,這是MySQL所沒有的。
『伍』 mysql 存儲過程中的 if exists 判斷問題
SELECT沒有IF EXISTS 語法,你可以用select count(*) from information_schema.tables where table_schema='your_schema' and table_name='your_tab';看返回0還是1來判斷。
『陸』 mysql 存儲過程總結(一)
1、存儲過程定義:
存儲過程是事先經過編譯並存儲在資料庫中的一段 SQL 語句的集合,調用存儲過程可以簡化應用開發 人員的很多工作,減少數據在資料庫和應用伺服器之間的傳輸,對於提高數據處理的效率是有好處的。 存儲過程思想上很簡單,就是資料庫 SQL 語言層面的代碼封裝與重用。
2、特點:
封裝,復用 : 可以把某一業務SQL封裝在存儲過程中,需要用到 的時候直接調用即可。
可以接收參數,也可以返回數據 :再存儲過程中,可以傳遞參數,也可以接收返回 值。
減少網路交互,效率提升 : 如果涉及到多條SQL,每執行一次都是一次網路傳 輸。 而如果封裝在存儲過程中,我們只需要網路交互一次可能就可以了。
3、基本語法
(1)創建:
(2)調用:
(3)查看:
(4)刪除
注意: 在命令行中,執行創建存儲過程的SQL時,需要通過關鍵字 delimiter 指定SQL語句的 結束符。
『柒』 MySql編寫一個存儲過程
1、delimiter // ,聲明分隔符:DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼(這里如果不懂的話,你可以通過試錯的方法來理解)。
2、編寫存儲過程的格式:CREATE PROCEDURE([[IN |OUT |INOUT ]參數名數據類形...])
例子:
1)create procere proc1(out s int) // 只有輸出
2)create procere proc2(in p_in bigint) // 只有輸入
3)create procere proc15() // 沒有輸入與輸出
4)create procere demo_multi_param(in id bigint,in name varchar(32),out c int) //多輸入與輸出
3、過程體的開始與結束使用BEGIN與END進行標識。
4、select count (*) into s from student; // 過程體,一系列的邏輯語句,sql語句
5、delimiter ; 用完了之後要把分隔符還原。