首先,什么是存儲過程?
存儲過程是為了完成某個數據庫中的特定個功能而完成的語句集。該語句集包括SQL語句(對數據的增刪改查),條件語句和查詢語句。
創建存儲過程:
存儲過程的創建方法非常簡單,格式為:
CREATE PROCEDURE proc_name ([proc_parameter[,...]])
[characteristic]
routine_body
說明:proc_name代表存儲過程名稱。
proc_parameter代表存儲過程參數列表。該列表中的每個參數由三部分組成,即輸入輸出類型,參數名稱和參數類型。其形式如下:[IN|OUT|INOUT]表示輸出類型(IN表示輸入參數,OUT表示輸出參數;INOUT表示既可以輸入也可以是輸出。輸入輸出類型也可以去掉,默認為in);
para_name表示參數名稱(注意:MYSQL數據庫存儲過程的參數名前不允許"@",SQL Serever數據庫中可以);type表示參數類型,該類型可以是MYSQL數據庫任意數據類型。
注意:MYSQL數據庫存儲過程不需要在參數列表括號后面加上"as"關鍵字,但是在SQL Server數據庫中的存儲過程必須加"as"關鍵字。
characteristic指定存儲過程的特性:該參數有多個值:
LANGUAGE SQL:說明 routine_body部分是由SQL語言的語句組成,數據庫系統默認值。
[NOT] DETERMINISTIC:指明存儲過程的執行結果是否是確定的。DETERMINISTIC表示結果是確定的,這時,當每次執行存儲過程時先通的輸入會得到相同的輸出。
NOT DETERMINISTIC 表示結果是非確定的,這時相同的輸入可能得到不同的輸出,默認為非確定。
{CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA}:指明子程序使用SQL語句的限制。CONTAINS SQL表示子程序包含SQL語句,但不包含讀或寫數據的語句;MODIFIES SQL DATA 表示子程序中包含寫數據的語句。默認為CONTAINS SQL。
SQL SQCURITY{DEFINER|INVOKER}:指明誰有權限來執行。DEFINER表示只有定義者自己才能夠執行;INVOKER表示調用者可以執行。默認為DEFINER。
COMMENT'string':存儲過程注釋信息。
routine_body_參數為存儲過程體,BEGIN...END標志存儲過程體的開始和結束。存儲過程體可以是SELECT、UPDATE、INSERT、DELETE、CREATE TABLE、等SQL語句,也可以嵌入調用其他存儲過程的代碼,還可以是其他代碼。
注意:不能在MYSQL存儲過程中使用"return"關鍵字。
示例一 使用存儲過程創建表的結構:
delimiter $$
create procedure create_table()
language sql
begin
create table 'user'(
'id' int(11) not null auto_incerment commit '主鍵 ',
'real_name ' varchar(8) not null comment '姓名',
'age' int (3) default null comment ’年齡‘,
' primary key' ('id')
)engine=innodb auto_increment=1 default charset=utf8;
end &&
delimiter;
說明:上面創建了一個名稱為create_table的存儲過程;
注意:MySQL中默認的語句結束符為分號(;),存儲過程中的SQL語句需要分號來結束,為了避免沖突,首先用"DELIMITER &&"將MySQL的結束符設置為&&,最后再用"DELIMITER ;"來將結束符恢復成分號。這與創建觸發器是一樣的。
調用存儲過程:
[sql] view plain copy
CALL create_table();
示例二——向創建好的表中添加數據:
創建存儲過程:
[sql] view plain copy
DELIMITER &&
CREATE PROCEDURE insert_data (IN u_real_name VARCHAR(8), IN u_age INT(3), OUT u_id INT(11))
LANGUAGE SQL
BEGIN
INSERT INTO USER (real_name, age)VALUES(u_real_name, u_age);
SET u_id=LAST_INSERT_ID();#或SET u_id=@@IDENTITY;
END &&
DELIMITER ;
說明:上面創建的存儲過程參數列表中u_real_name和u_age為輸入變量,u_id為輸出變量,該輸出變量返回所添加數據對應的主鍵值;
調用存儲過程:
[sql] view plain copy
CALL insert_data('小明',21, @u_id);
SELECT @u_id;
示例三——修改表中的數據:
創建存儲過程:
[sql] view plain copy
DELIMITER &&
CREATE PROCEDURE update_data (IN u_id INT(11),IN u_real_name VARCHAR(8), IN u_age INT(3))
LANGUAGE SQL
BEGIN
UPDATE USER SET real_name = u_real_name, age = u_age WHERE id = u_id;
END &&
DELIMITER ;
調用存儲過程:
CALL update_data(1,'王佳佳',18);
示例四——依據姓名進行模糊查詢獲得符合條件的人數:
創建存儲過程:
[sql] view plain copy
DELIMITER &&
CREATE PROCEDURE num_from_user (IN u_real_name VARCHAR(15), OUT count_num INT)
READS SQL DATA
BEGIN
SELECT COUNT(*) INTO count_num FROM USER WHERE real_name LIKE u_real_name;
END &&
DELIMITER ;
說明:上面創建的存儲過程參數列表中u_real_name為輸入變量;count_num為輸出變量。
SELECT語句從user表模糊查詢real_name值等于u_real_name的記錄,并用COUNT(*)統計符合條件的數據總數,然后將結果存入count_num中。
調用存儲過程:
[sql] view plain copy
SET @u_real_name='王%';
CALL num_from_user(@u_real_name,@count_num);
SELECT @count_num AS total;
說明:上面顯示姓王的人數,其中@u_real_name和@count_num為用戶名變量。
示例五——依據主鍵id刪除數據:
創建存儲過程:
[sql] view plain copy
DELIMITER &&
CREATE PROCEDURE delete_data (IN u_id INT(11), OUT effect_number INT(3))
LANGUAGE SQL
BEGIN
DELETE FROM USER WHERE id = u_id;
SET effect_number = ROW_COUNT();#ROW_COUNT()用于返回受影響的行數
END &&
DELIMITER ;
調用存儲過程:
[sql] view plain copy
CALL delete_data(1, @effect_number);
SELECT @effect_number;
查看存儲過程:
存儲過程的查看可以通過如下語句實現:SHOW PROCEDURE STATUS WHERE db='數據庫名';或SHOW CREATE PROCEDURE 數據庫名.存儲過程名;
刪除存儲過程:
存儲過程的刪除可以通過如下語句實現:DROP PROCEDURE 存儲過程名
存儲過程優點:
1、存儲過程增強了SQL語言靈活性。存儲過程可以使用控制語句編寫,可以完成復雜的判斷和較復雜的運算,有很強的靈活性;
2、減少網絡流量,降低了網絡負載。存儲過程在數據庫服務器端創建成功后,只需要調用該存儲過程即可,而傳統的做法是每次都將大量的SQL語句通過網絡發送至數據庫服務器端然后再執行;
3、存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
4、系統管理員通過設定某一存儲過程的權限實現對相應的數據的訪問權限的限制,避免了非授權用戶對數據的訪問,保證了數據的安全。