<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
MySQL 5.0 版本開始支援儲存過程。
簡單的說,儲存過程就是一組SQL語句集,功能強大,可以實現一些比較複雜的邏輯功能,類似於JAVA語言中的方法;Python裡面的函數;
儲存過就是資料庫 SQL 語言層面的程式碼封裝與重用。
特點:
有輸入輸出引數,可以宣告變數,有if/else, case,while等控制語句,通過編寫儲存過程,可以實現複雜的邏輯功能;
函數的普遍特性:模組化,封裝,程式碼複用;
速度快,只有首次執行需經過編譯和優化步驟,後續被呼叫可以直接執行,省去以上步驟;
delimiter 自定義結束符號 create procedure 儲存名([ in ,out ,inout ] 引數名 資料類形...) begin sql語句 end 自定義的結束符合 delimiter ;
delimiter $$ create procedure proc01() begin select empno,ename from emp; end $$ delimiter ; -- 呼叫儲存過程 call proc01();
注意建立的時候需要指定delimiter $$(自定義的,但是通常使用這個),然後使用create procedure 儲存名(有輸入引數 輸出引數) 然後記住有begin 和end 之間就寫SQL語句,並且需要在end後面加上$$,最後用delimiter ;
使用者自定義,在begin/end塊中有效 ,也就是相對於在函數內部中宣告變數
關鍵詞:declare 變數名 型別(長度)可以加預設值——類似於我們python或者java中的 int a=10;
delimiter $$ create procedure proc02() begin declare var_name01 varchar(20) default ‘aaa'; -- 定義區域性變數 set var_name01 = ‘zhangsan'; select var_name01; end $$ delimiter ; -- 呼叫儲存過程 call proc02();
定義變數之後,使用set給變數賦值
MySQL 中還可以使用 SELECT..INTO 語句為變數賦值。
其基本語法如下:
select col_name [...] into var_name[,...] from table_name wehre condition
其中:
注意:當將查詢結果賦值給變數時,該查詢語句的返回結果只能是單行單列(單元格值)
delimiter $$ create procedure proc03() begin declare my_ename varchar(20) ; select ename into my_ename from emp where empno=1001; select my_ename; end $$ delimiter ; -- 呼叫儲存過程 call proc03();
如果是在內部宣告的變數,並且進行了賦值之後,那麼在內部呼叫顯示的時候,可以直接select就可以實現展示資料的效果
使用者自定義,當前對談(連線)有效。類比java的成員變數
語法:
@var_name
不需要提前宣告,使用即宣告
delimiter $$ create procedure proc04() begin set @var_name01 = 'ZS'; end $$ delimiter; call proc04() ; select @var_name01 ; --可以看到結果
這裡使用@進行宣告,前提不需要對其型別進行宣告,直接可以賦值,但是呼叫的時候也需要@變數名
宣告一般有兩種方法:
1、declare 變數名 型別(長度)
2、直接使用@變數名=?
系統變數又分為全域性變數與對談變數
全域性變數在MYSQL啟動的時候由伺服器自動將它們初始化為預設值,這些預設值可以通過更改my.ini這個檔案來更改。
對談變數在每次建立一個新的連線的時候,由MYSQL來初始化。MYSQL會將當前所有全域性變數的值複製一份。來做為對談變數。
也就是說,如果在建立對談以後,沒有手動更改過對談變數與全域性變數的值,那所有這些變數的值都是一樣的。
全域性變數與對談變數的區別就在於,對全域性變數的修改會影響到整個伺服器,但是對對談變數的修改,只會影響到當前的對談(也就是當前的資料庫連線)。
有些系統變數的值是可以利用語句來動態進行更改的,但是有些系統變數的值卻是唯讀的,對於那些可以更改的系統變數,我們可以利用set語句進行更改。
檢視修改全域性變數:
-- 檢視全域性變數 show global variables; -- 檢視某全域性變數 select @@global.auto_increment_increment; -- 修改全域性變數的值 set global sort_buffer_size = 40000; set @@global.sort_buffer_size = 40000;
檢視修改對談變數:
-- 檢視對談變數 show session variables; -- 檢視某對談變數 select @@session.auto_increment_increment; -- 修改對談變數的值 set session sort_buffer_size = 50000; set @@session.sort_buffer_size = 50000 ;
in 表示傳入的引數, 可以傳入數值或者變數,即使傳入變數,並不會更改變數的值,可以內部更改,僅僅作用在函數範圍內。
注意:這裡參入引數如果和欄位名一樣的話,一般不要命名一樣的名字,如果不小心命名一樣的,那麼也需要在表中指定,表.欄位
而且需要注意的是宣告輸入引數:in 引數名 型別(長度)
-- 封裝有引數的儲存過程,傳入員工編號,查詢員工資訊 delimiter $$ create procedure dec_param01(in param_empno varchar(20)) begin select * from emp where empno = param_empno; end $$ delimiter ; call dec_param01('1001');
-- 封裝有引數的儲存過程,可以通過傳入部門名和薪資,查詢指定部門,並且薪資大於指定值的員工資訊 delimiter $$ create procedure dec_param0x(in dname varchar(50),in sal decimal(7,2),) begin select * from dept a, emp b where b.sal > sal and a.dname = dname; end $$ delimiter ; call dec_param0x('學工部',20000);
通過上述的案例,我們也可以發現,一般如果傳入引數的時候,是字串就用varchar(),如果是數值就用decimal(),當然有時候也可以使用數值型別,字元型別。
out 表示從儲存過程內部傳值給呼叫者
-- ---------傳出引數:out--------------------------------- use mysql7_procedure; -- 封裝有引數的儲存過程,傳入員工編號,返回員工名字 delimiter $$ create procedure proc08(in empno int ,out out_ename varchar(50) ) begin select ename into out_ename from emp where emp.empno = empno; end $$ delimiter ; call proc08(1001, @o_ename); select @o_ename;
輸出的時候,需要在儲存方法中指定,並@變數名,最後才能讓這個變數接收到數值
其次輸出引數的定義的時候,也和輸入引數一樣的,out 引數名 型別(長度)
-- 封裝有引數的儲存過程,傳入員工編號,返回員工名字和薪資 delimiter $$ create procedure proc09(in empno int ,out out_ename varchar(50) ,out out_sal decimal(7,2)) begin select ename,sal into out_ename,out_sal from emp where emp.empno = empno; end $$ delimiter ; call proc09(1001, @o_dname,@o_sal); select @o_dname; select @o_sal;
內部接收的時候就需要使用 into 變數名,變數名……
注意:也就是說,在儲存過程中使用out宣告輸出引數,在內部檢視into 進行賦值之後,最後在呼叫儲存的時候需要在裡面自定義一個變數進行接收 但是必須要 使用@變數名
inout 表示從外部傳入的引數經過修改後可以返回的變數,既可以使用傳入變數的值也可以修改變數的值(即使函數執行完)
-- 傳入員工名,拼接部門號,傳入薪資,求出年薪 delimiter $$ create procedure proc10(inout inout_ename varchar(50),inout inout_sal int) begin select concat(deptno,"_",inout_ename) into inout_ename from emp where ename = inout_ename; set inout_sal = inout_sal * 12; end $$ delimiter ; set @inout_ename = '關羽'; set @inout_sal = 3000; call proc10(@inout_ename, @inout_sal) ; select @inout_ename ; select @inout_sal ;
相對於,如果我們使用inout關鍵詞,這個引數可以作為輸入引數,也可以作為輸出引數,輸出引數時候,可以在內部的語句進行修改,然後覆蓋原來的值,最後呼叫的時候可以定義一樣的變數名,也可以不一樣。
到此這篇關於MySQL儲存過程輸入引數(in),輸出引數(out),輸入輸出引數(inout)的文章就介紹到這了,更多相關MySQL儲存過程輸入輸出內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45