mysql 动态传入表名 存储过程_面试再问MySQL存储过程和触发器就把这篇文章给他...
Mysql存儲過程及觸發(fā)器trigger
存儲過程
一、一個(gè)簡單的存儲過程
1,一個(gè)簡單的存儲過程
delimiter $$create procedure testa()begin Select * from emp; Select * from dept; End;$$;delimiter ;-- 調(diào)用存儲過程call testa();存儲過程的結(jié)構(gòu)組成:
1,創(chuàng)建格式:create procedure 存儲過程名
2,包含一個(gè)以上代碼塊,代碼塊使用begin和end之間
3,在命令行中創(chuàng)建需要定義分隔符 delimiter $$
2,存儲過程的特點(diǎn)
1,能完成復(fù)雜的判斷和運(yùn)算
2,可編程性強(qiáng),靈活
3,SQL編程的代碼可重復(fù)使用
4,執(zhí)行速度相對快
5,減少網(wǎng)絡(luò)之間數(shù)據(jù)傳輸,節(jié)省開銷
二、存儲過程變量
1,存儲過程中的變量
需求:編寫存儲過程,使用變量取empno=7369的用戶名
Delimiter $$;Create procedure testa();BEGIN DECLARE my_uname varchar(32) default ""; -- 定義變量my_uname SET my_uname='smith'; -- 為變量my_uname賦值 -- 查詢empno=7369的用戶名,并將值賦給my_uname select ename into my_uname from emp where empno=7369; -- 為變量賦值 select my_uname;-- 返回my_uname的值END;$$;Delimiter ;特點(diǎn):
1,變量的聲明使用declare,一句declare只聲明一個(gè)變量,變量必須先聲明后使用。
2,變量具有數(shù)據(jù)類型和長度,與mysql的SQL數(shù)據(jù)類型保持一致,還能指定默認(rèn)值、字符集和排序規(guī)則等。
3,變量可以通過set來賦值,也可以通過select into的方式賦值。
4,變量需要返回,可以使用select語句,如:select 變量名
2,存儲過程變量應(yīng)用示例
需求:統(tǒng)計(jì)表emp、dept的行數(shù)和emp表中最早,最晚的入職日期。
Delimiter $$;Create procedure stats_emp();BEGIN-- 統(tǒng)計(jì)emp和dept表中的記錄數(shù) BEGIN DECLARE emp_sum int default 0; DECLARE dept_sum int default 0; select count(*) into emp_sum from emp; select count(*) into dept_sum from dept; select emp_sum,dept_sum; END;-- 統(tǒng)計(jì)最早、最晚入職日期 BEGIN DECLARE max_time TIMESTAMP ; DECLARE min_time TIMESTAMP; select max(hiredate),min(hiredate) into max_time,min_time from emp; select max_time,min_time; END;END$$;Delimiter ;三、存儲過程的參數(shù)
1,存儲過程的傳入?yún)?shù)IN
需求:編寫存儲過程,傳入empno,返回該用戶的ename.
Delimiter $$;Create procedure test_param(IN my_empno int);--------BEGIN DECLARE my_ename varchar(32) default ''; select ename into my_ename from emp where empno=my_empno; select my_ename;END;$$Delimiter ;-- 調(diào)用Call test_param(7369);提示:
1,傳入?yún)?shù):類型為IN,表示該參數(shù)的值必須在調(diào)用存儲過程時(shí)指定,如果不顯示指定為IN,那么默認(rèn)就是IN類型。
2,IN類型參數(shù)一般只用于傳入,在調(diào)用存儲過程中一般不作修改和返回。
3,如果調(diào)用存儲過程中需要修改和返回值,可以使用OUT類型參數(shù)。
2,存儲過程的傳出參數(shù)OUT
需求:調(diào)用存儲過程時(shí),傳入empno,返回該用戶的ename。
Delimiter $$;create procedure test_param(IN my_empno int,OUT my_ename varcahr(32));--------BEGIN select ename into my_ename from emp where empno=my_empno; select my_ename;END;$$Delimiter ;-- 調(diào)用Set @uname=’’;Call test_param_out(7369,@uname);提示:
1,傳出參數(shù):在調(diào)用存儲過程中,可以改變其值,并可返回。
2,OUT是傳出參數(shù),不能用于傳入?yún)?shù)值。
3,調(diào)用存儲過程時(shí),OUT參數(shù)也需要指定,但必須是變量,不能是常量。
4,如果既需要傳入,同時(shí)又需要傳出,則可以使用INOUT類型參數(shù)。
3,存儲過程的可變參數(shù)INOUT
需求:調(diào)用存儲過程時(shí),參數(shù)my_empno和my_ename,既是傳入,也是傳出參數(shù)。
Delimiter $$;create procedure test_param_inout(INOUT my_empno int,INOUT my_ename varchar(32));BEGIN set my_empno=7369; set my_ename="smith"; select ename,empno into my_ename,my_empno from emp where empno=my_empno;END;$$Delimiter ;-- 調(diào)用set @uname:='';set @empno:=7399;call test_param_inout(@empno,@uname);select @empno,@uname;特點(diǎn):
1,可變變量INOUT,調(diào)用時(shí)可傳入值,在調(diào)用過程中,可以修改其值,同時(shí)也可以返回值。
2,INOUT 參數(shù)集合了IN和OUT類型參數(shù)的功能
3,INOUT調(diào)用時(shí)傳入的是變量,而不是常量
四、存儲過程條件語句
1,存儲過程的條件語句
需求:編寫存儲過程,如果用戶empno是偶數(shù)則給出ename,其他情況只返回empno.
Delimiter $$;create procedure test_if(IN my_empno int);BEGINDECLARE my_ename VARCHAR(32) default ''; if(my_empno %2=0) then select ename into my_ename from emp where empno=my_empno;select my_ename; else select my_empno; end if;END;$$Delimiter ;-- 調(diào)用call test_if(7369);特點(diǎn):
1,條件語句最基本結(jié)構(gòu): if() then ... else ... end if;
2,if判斷返回邏輯真或者假,表達(dá)式可以是任意返回真或假的表達(dá)式
2,存儲過程的條件語句應(yīng)用示例
需求:根據(jù)用戶傳入的empno參數(shù)判斷:
(1)如果用戶sal小于2000,則給用戶加薪200
(2)如果用戶sal小于1000,則給用戶加薪500
(3)其他情況加薪100
Delimiter $$;create procedure test_if_else(IN my_empno int);BEGINDECLARE my_sal int default 0; select sal into my_sal from emp where empno=my_empno; if(my_sal<1000) then update emp set sal=sal+500 where empno=my_empno; ELSEIF(my_sal<2000) then update emp set sal=sal+200 where empno=my_empno; else update emp set sal=sal+100 where empno=my_empno; end if;END;$$Delimiter ;-- 調(diào)用call test_if_else(7369);特點(diǎn):
多條件判斷結(jié)構(gòu):
If()
Then
...
Else if()
Then
...
Else
...
End if;
五、存儲過程循環(huán)語句
1,while循環(huán)
需求:使用循環(huán)語句,向表emp中插入10條empno連續(xù)的記錄。
Delimiter $$;create procedure test_while();BEGIN DECLARE i int default 0; while(i<10) DO BEGIN set i=i+1; insert into acc(id) values(i); END; END WHILE; END;$$Delimiter ;-- 調(diào)用call test_while();特點(diǎn):
1,while語句最基本結(jié)構(gòu): while() do begin ... end end while;;
2,while判斷返回邏輯真或者假,表達(dá)式可以是任意返回真或假的表達(dá)式
2,repeat循環(huán)語句
需求:使用repeat循環(huán)向表acc插入10條id連續(xù)的記錄
Delimiter $$;create procedure test_repeat();BEGIN DECLARE i int default 100; REPEAT BEGIN set i=i+1; insert into acc(id) values(i); END; UNTIL i>=110 END REPEAT;END;$$Delimiter ;-- 調(diào)用call test_repeat();特點(diǎn):
1,repeat語句最基本結(jié)構(gòu): repeat begin ... end until end repeat;;
2,while判斷返回邏輯真或者假,表達(dá)式可以是任意返回真或假的表達(dá)式
六、存儲過程游標(biāo)的使用
1,什么是游標(biāo)
需求:編寫存儲過程,使用游標(biāo),把uid為偶數(shù)的記錄逐一更新用戶名。
Delimiter $$;create procedure test_cursor();BEGIN DECLARE stopflag INT DEFAULT 0; -- 游標(biāo)停止的標(biāo)記 0:未停止 1:已停止 DECLARE my_uname VARCHAR(32) default ''; -- 存儲查詢出的用戶名 DECLARE uname_cursor CURSOR for select uname from acc where uid%2=0; -- 定義游標(biāo)uname_cursor,并指定結(jié)果集 DECLARE CONTINUE HANDLER for NOT found set stopflag=1; -- 游標(biāo)結(jié)束后stopflag設(shè)置為1 open uname_cursor; -- 打開游標(biāo) FETCH uname_cursor into my_uname; -- -- 游標(biāo)向前走一步,取出一條記錄放到my_uname中my_uname WHILE(stopflag=0) DO BEGIN update acc set uname=CONCAT(my_uname,"_cur") where uname=my_uname; FETCH uname_cursor into my_uname; END; end WHILE; close uname_cursor;END;$$Delimiter ;-- 調(diào)用call test_repeat();特點(diǎn):
declare uname_cur Cursor for select uname from acc where uid%2=0;
1,游標(biāo)是保存查詢結(jié)果的臨時(shí)內(nèi)存區(qū)域
2,游標(biāo)變量uname_cur保存了查詢的臨時(shí)結(jié)果,實(shí)際上就是查詢結(jié)果集
Declare continue handler for not found set stopflag=1;
3,當(dāng)游標(biāo)變量中保存的結(jié)果都查詢一遍(遍歷),到達(dá)結(jié)尾,把變量stopflag設(shè)為1。
4, FETCH uname_cursor into my_uname; -- 游標(biāo)向前走一步,取出一條記錄放到my_uname中
Mysql函數(shù)
一、一個(gè)簡單函數(shù)
需求:編寫函數(shù),傳入一個(gè)uid,返回用戶的uname
Delimiter $$; CREATE FUNCTION f01_simple(my_uid int) RETURNS varchar(32) CHARSET utf8BEGIN DECLARE my_uname varchar(32) default ''; select uname into my_uname from acc where uid=my_uid;RETURN my_uname;END$$Delimiter ;-- 調(diào)用Select f01_simple(2);特點(diǎn):
1,創(chuàng)建函數(shù)使用 create function 函數(shù)名(參數(shù)) return 返回值
2,函數(shù)體放在begin和end之間
3,return 指定函數(shù)的返回值
4,函數(shù)調(diào)用: select 函數(shù)名(實(shí)參);
二、自定義函數(shù)綜合應(yīng)用示例
1,自定義函數(shù)示例01
需求:輸入用戶uid,獲得accountid,uid,uname組合的uuid值,作為用戶的唯一標(biāo)識。
Delimiter $$; CREATE FUNCTION test_uuid(my_uid int) RETURNS varchar(32) CHARSET utf8BEGIN DECLARE uuid varchar(32) default ''; select CONCAT(accountid,"_總結(jié)
以上是生活随笔為你收集整理的mysql 动态传入表名 存储过程_面试再问MySQL存储过程和触发器就把这篇文章给他...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5怎么关闭作弊模式_相机5种主要的拍摄模
- 下一篇: mysql 白皮书_mysql企业版 《