標籤:
預存程序介紹
預存程序是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中。使用者通過指定預存程序的名字並給出參數(如果該預存程序帶有參數)來執行它。
預存程序可由應用程式通過一個調用來執行,而且允許使用者聲明變數 。 同時,預存程序可以接收和輸出參數、返回執行預存程序的狀態值,也可以嵌套調用。
優點:
1、減少網路通訊量。調用一個行數不多的預存程序與直接調用SQL語句的網路通訊量可能不會有很大的差別,可是如果預存程序包含上百行SQL語句,那麼其效能絕對比一條一條的調用SQL語句要高得多。
2、執行速度更快。預存程序建立的時候,資料庫已經對其進行了一次解析和最佳化。其次,預存程序一旦執行,在記憶體中就會保留一份這個預存程序,這樣下次再執行同樣的預存程序時,可以從記憶體中直接中讀取。
3、更強的安全性。預存程序是通過向使用者授予許可權(而不是基於表),它們可以提供對特定資料的訪問,提高代碼安全,比如防止 SQL注入。
缺點:
1、可移植性方面:當從一種資料庫遷移到另外一種資料庫時,不少的預存程序的編寫要進行部分修改。
2、預存程序需要花費一定的學習時間去學習
建立預存程序:
1、沒有參數
CREATE PROCEDURE helloWord () LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER COMMENT ‘A procedure‘ BEGIN SELECT ‘Hello World !‘;END1) 首先在定義好終結符後,使用CREATE PROCEDURE+預存程序名的方法建立預存程序,LANGUAGE選項指定了使用的語言,這裡預設是使用SQL。 2) DETERMINISTIC關鍵詞的作用是,當確定每次的預存程序的輸入和輸出都是相同的內容時,可以使用該關鍵詞,否則預設為NOT DETERMINISTIC。 3) SQL SECURITY關鍵詞,是表示調用時檢查使用者的許可權。當值為INVOKER時,表示是使用者調用該預存程序時檢查,預設為DEFINER,即建立預存程序時檢查。 4) COMMENT部分是預存程序的注釋說明部分。 5) 在BEGIN END部分中,是預存程序的主體部分。//刪除預存程序DROP PROCEDURE IF EXISTS helloWord;//調用預存程序----->也可以傳遞參數CALL helloWord()
View Code
2、帶參數
//帶參數的預存程序CREATE PROCEDURE selectUser(IN userCode VARCHAR(255)) BEGIN select * from tuser where user_code=userCode; ENDCALL selectUser(‘9001‘);create procedure usp_GetEmployeeName(IN userCode VARCHAR(255), OUT name VARCHAR(255)) begin select regName into name from tuser where user_code=userCode; endCALL usp_GetEmployeeName(‘9001‘,@uName);create procedure pr_param_inout(inout id int) begin select id as id_inner_1; -- id 值為調用者傳進來的值 if (id is not null) then set id = id + 1; select id as id_inner_2; else select 1 into id; end if; select id as id_inner_3; end;set @id = 10;call pr_param_inout(@id);
View Code
mysql 預存程序