-- 存儲過程
create database mysql7_procedure;
use mysql7_procedure;
-- 1:創建存儲過程
-- delimiter自定義結束符號
-- create procedure 儲存名([ in,out ,inout ] 參數名 數據類形...)
-- begin
-- sql語句
-- end 自定義的結束符合
-- delimiter;
存儲數據
create table dept(
deptno int primary key,
dname varchar(20),
loc varchar(20)
);
insert into dept values(10, '教研部','北京'),
(20, '學工部','上海'),
(30, '銷售部','廣州'),
(40, '財務部','武漢');
create table emp(
empno int primary key,
ename varchar(20),
job varchar(20),
mgr int,
hiredate date,
sal numeric(8,2),
comm numeric(8, 2),
deptno int,
-- FOREIGN KEY (mgr) REFERENCES emp(empno),
FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE
);
insert into emp values
(1001, '甘寧', '文員', 1013, '2000-12-17', 8000.00, null, 20),
(1002, '黛綺絲', '銷售員', 1006, '2001-02-20', 16000.00, 3000.00, 30),
(1003, '殷天正', '銷售員', 1006, '2001-02-22', 12500.00, 5000.00, 30),
(1004, '劉備', '經理', 1009, '2001-4-02', 29750.00, null, 20),
(1005, '謝遜', '銷售員', 1006, '2001-9-28', 12500.00, 14000.00, 30),
(1006, '關羽', '經理', 1009, '2001-05-01', 28500.00, null, 30),
(1007, '張飛', '經理', 1009, '2001-09-01', 24500.00, null, 10),
(1008, '諸葛亮', '分析師', 1004, '2007-04-19', 30000.00, null, 20),
(1009, '曾阿牛', '董事長', null, '2001-11-17', 50000.00, null, 10),
(1010, '韋一笑', '銷售員', 1006, '2001-09-08', 15000.00, 0.00, 30),
(1011, '周泰', '文員', 1008, '2007-05-23', 11000.00, null, 20),
(1012, '程普', '文員', 1006, '2001-12-03', 9500.00, null, 30),
(1013, '龐統', '分析師', 1004, '2001-12-03', 30000.00, null, 20),
(1014, '黃蓋', '文員', 1007, '2002-01-23', 13000.00, null, 10);
create table salgrade(
grade int primary key,
losal int,
hisal int
);
insert into salgrade values
(1, 7000, 12000),
(2, 12010, 14000),
(3, 14010, 20000),
(4, 20010, 30000),
(5, 30010, 99990);
delimiter $$
create procedure proc01()
begin
select empno,ename from emp;
end $$
delimiter ;#恢復結束符為分號
-- 調用存儲過程
call proc01();
-- 定義局部變量
/*
語法1:聲明變量 declare var_name type [default var_value];
語法2: select col_name [...] into var_name
[,...)
from table_name wehre condition
*/
delimiter $$
create procedure proc02()
begin
declare var_name01 varchar(20) default 'aaa';#聲明變量
set var_name01 = 'zhangsan';#給變量賦值
select var_name01;#輸出變量
end $$
delimiter ;
call proc02()
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()
-- 用戶變量
delimiter $$
create procedure proc04()
begin
set @var_nam01 = 'beijing';
select @var_nam01;
end $$
delimiter ;
call proc04()
select @var_nam01;#在外部也可以使用用戶變量
-- 系統變量
-- 全局變量
use mysql7_procedure;
-- 查看全局變量
show global variables;-- 查看某全局變量
select @@global.auto_increment_increment;
-- 修改全局變量的值
set global sort_buffer_size = 40000;
set @@global.sort_buffer_size = 34000;
select @@global.sort_buffer_size;
-- 會話變量
-- 查看會話變量
show session variables;
-- 查看某會話變量
select @@session.auto_increment_increment;
-- 修改會話變量的值
set session sort_buffer_size = 50000;
set @@session.sort_buffer_size = 50000;
-- 傳入參數:in
-- 封裝有參數的存儲過程,傳入員工編號,查找員工信息
delimiter $$
create procedure proc06(in param_empno int)
begin
select * from emp where empno = param_empno;
end $$
delimiter ;
call proc06(1001);
call proc06(1002);#在外部也可以使用用戶變量
-- 封裝有參數的存儲過程,可以通過傳入部門名和薪資,查詢指定部門,並且薪資大於指定員工信息
delimiter $$
create procedure proc07(in param_dname varchar(50),in param_sal decimal(7,2))
begin
select * from dept a, emp b where a.deptno=b.deptno and a.dname = param_dname and b.sal >param_sal;
end $$
delimiter ;
call proc07('學工部',20000)