創建存儲過程
網站建設哪家好,找成都創新互聯公司!專注于網頁設計、網站建設、微信開發、微信小程序定制開發、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了洱源免費建站歡迎大家使用!
mysql
delimiter
$
--
delimiter
$是設置
$為命令終止符號,代替默認的分號,因為分號有其他用處.
mysql
create
procedure
sp_test(IN
pi_id
int,
OUT
po_name
varchar(10))
-
begin
-
select
*
from
test.tb_test;
-
select
tb_test.name
into
po_name
from
test.tb_test
where
tb_test.id
=
pi_id;
-
end
-
$
Query
OK,
rows
affected
(0.00
sec)
mysql
delimiter
;
--
恢復分號作為分隔終止符號
5.調用存儲過程
mysql
set
@po_name='';
Query
OK,
rows
affected
(0.00
sec)
mysql
call
sp_test(1,@po_name);
給你個例子
drop procedure if exists call proc_temp;
delimiter $ //存儲過程從$ 開始
create procedure proc_temp(
IN startDate VARCHAR(20),//設置傳入的變量,沒有可以不要傳
IN endDate VARCHAR(20))
BEGIN
DECLARE dflag INT(11); //這里可以定義你需要的僅在存儲過程里使用的變量
SET dflag = 0;//初始化
select * from table where time between startDate and endDate ;//你的sql語句,可以一句可以多句
END $//存儲過程從$ 結束
delimiter ;
當上面的選中運行后沒問題,可以選中下面的call xx 運行,上面的代碼沒有改動的話只需要運行一次
1、delimiter // ,聲明分隔符:DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那么編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼(這里如果不懂的話,你可以通過試錯的方法來理解)。
2、編寫存儲過程的格式:CREATE PROCEDURE([[IN |OUT |INOUT ]參數名數據類形...])
例子:
1)create procedure proc1(out s int) // 只有輸出
2)create procedure proc2(in p_in bigint) // 只有輸入
3)create procedure proc15() // 沒有輸入與輸出
4)create procedure 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 ; 用完了之后要把分隔符還原。
? create procedure用來創建 存儲過程 ,create function用來創建 函數
? Delimiter命令是改變語句的結束符 ,MySQL默認的結束符為;號,由于procedure和function中的;號并不代表創建的結束,所以要替換成另外的結束符以便表示創建的結束
? rontine_body子句可以包含一個簡單的SQL語句,也可以包含多個SQL語句, 通過begin…end將這多個SQL語句 包含在一起
? MySQL存儲過程和函數中也可以包含類似create和drop等DDL語句
? comment子句用來寫入對存儲過程和函數的注釋
? Language子句用來表示此存儲過程和函數的創建語言
? 存儲過程和函數被標注為deterministic表明當輸入相同的參數是會返回相同的結果,反之如果是not deterministic則表示相同參數不會是相同結果,默認是not deterministic
? 相關屬性短語只有咨詢含義,并不是強制性的約束
? Drop procedure/function語句用來 刪除指定名稱的存儲過程或函數
? Begin…end語句通常出現在存儲過程、函數和觸發器中,其中 可以包含一個或多個語句 ,每個語句用;號隔開
? 標簽label可以加在begin…end語句以及loop, repeat和while語句
? 語句中通過iterate和leave來控制流程,iterate表示返回指定標簽位置,leave表示跳出標簽
? Declare語句通常用來聲明本地變量、游標、條件或者handler
? Declare語句只允許出現在begin … end語句中而且必須出現在第一行
? Declare的順序也有要求,通常是先聲明本地變量,再是游標,然后是條件和handler
? 本地變量可以通過declare語句進行聲明
? 聲明后的變量可以通過select … into var_list進行賦值,或者通過set語句賦值,或者通過定義游標并使用fetch … into var_list賦值
? 通過declare聲明變量方法:
? MySQL支持if,case,iterate,leave,loop,while,repeat語句作為存儲過程和函數中的 流程控制語句 ,另外return語句也是函數中的特定流程控制語句
? Case語句在存儲過程或函數中表明了 復雜的條件選擇語句
? IF語句在存儲過程或函數中表明了 基礎的條件選擇語句
其中在 function 里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的 function 指定一個參數。
在 MySQL 中創建函數時出現這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;
? Iterate語句 僅出現在loop,repeat,while循環語句中,其含義表示重新開始此循環
? Leave語句表明 退出指定標簽的流程控制語句塊
? 通常會用在begin…end,以及loop,repeat,while的循環語句中
? Loop語句是存儲過程或函數中表達 循環執行 的一種方式
? repeat語句是存儲過程或函數中表達 循環執行 的一種方式
? while語句是存儲過程或函數中表達 循環執行 的一種方式
? Return語句用在 函數中,用來終結函數的執行并將指定值返回給調用者
? Cursor游標用來 聲明一個數據集
? 游標的聲明必須在變量和條件聲明之后,在handler聲明之前
? Cursor close語句用來 關閉之前打開的游標
? Cursor declare語句用來聲明一個游標和指定游標對應的數據集合, 通常數據集合是一個select語句
? Cursor fetch語句用來獲取游標指定數據集的 下一行數據 并將各個字段值賦予后面的變量
? Open cursor語句用來打開一個之前已經 聲明好的游標
? Declare condition語句命名 特定的錯誤條件 ,而該特定錯誤可以在declare…handler中指定 處理方法
? 比如在MySQL中1051error code表示的是unknown table的錯誤,如果要對這
個錯誤做特殊處理,可以用三種方法:
? Declare handler語句用來聲明一個handler來處理一個或多個特殊條件,當其中的某個條件滿足時則觸發其中的statement語句執行
? Statement可以是一個簡單SQL語句,也可以是begin…end組成的多個語句
? Handler_action子句聲明當執行完statement語句之后應該怎么辦
Condition_value的值有以下幾種:
? 當condition發生但沒有聲明handler時,則存儲過程和函數依照如下規則處理
? create trigger語句用來創建一個觸發器,觸發器的作用是當表上有對應SQL語句發生時,則觸發執行
? 觸發器創建時需要 指定對應的表名 tbl_name
? Definer關鍵詞用來指定trigger的安全環境
? Trigger_time指定觸發器的執行時間,BEFORE和AFTER指定觸發器在表中的 每行數據修改前或者后 執行
? Trigger_event指定觸發該觸發器的具體 事件
? INSERT當新的一行數據插入表中時觸發,比如通過執行insert,load data,replace語句插入新數據
? UPDATE當表的一行數據被修改時觸發,比如執行update語句時
? DELETE當表的一行數據被刪除時觸發,比如執行delete,replace語句時
? 當執行insert into … on duplicate key update語句時,當碰到重復行執行update時,則觸發update下的觸發器
? 從5.7.2版本開始,可以創建具有相同trigger_time和trigger_event的同一個表上的多個觸發器,默認情況下按照創建的時間依次執行,通過 指定FOLLOWS/PRECEDES改變執行順序 ,即FOLLOWS時表示新創建的觸發器后執行,PRECEDES則表示新觸發器先執行
? Trigger_body表示觸發器觸發之后要執行的一個或多個語句,在內部可以引用涉及表的字段, OLD.col_name表示行數據被修改或刪除之前的字段數據,NEW.col_name表示行數據被插入或修改之后的字段數據
? Drop trigger語句用來 刪除一個觸發器
? If exists短語用來避免刪除不存在的觸發器時引發報錯
? 當你執行drop table時,表上的觸發器也被drop掉了
創建存儲過程
CREATE PROCEDURE 存儲過程名()
一個例子說明:一個返回產品平均價格的存儲過程如下代碼:
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END;
//創建存儲過程名為productpricing,如果存儲過程需要接受參數,可以在()中列舉出來。即使沒有參數后面仍然要跟()。BEGIN和END語句用來限定存儲過程體,過程體本身是個簡單的SELECT語句
存儲過程(Stored
Procedure)是一組為了完成特定功能的SQL語句集功能是將常用或復雜的工作,預先用SQL語句寫好并用一個指定名稱存儲起來,
以后需要數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用
call
存儲過程名字,
即可自動完成命令。存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化后存儲在數據庫服務器中,可由應用程序通過一個調用來執行,而且允許用戶聲明變量
。同時,存儲過程可以接收和輸出參數、返回執行存儲過程的狀態值,也可以嵌套調用。
分享名稱:mysql怎么存儲過程,mysql怎么建立存儲過程
當前地址:http://m.kartarina.com/article40/hdojho.html
成都網站建設公司_創新互聯,為您提供企業網站制作、域名注冊、企業建站、商城網站、Google、用戶體驗
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯