谈谈啥是存储过程
1.存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
delimiter $$
CREATE PROCEDURE hello_procedure()
BEGIN
SELECT 'hello proced';
END $$
CALL hello_procedure()
delimiter $$
CREATE PROCEDURE sp_var01()
begin
DECLARE nickName VARCHAR(32) DEFAULT 'SF';
SELECT nickName;
set nickName ='UG';
SELECT nickName;
end $$
drop PROCEDURE sp_var01;
CALL sp_var01()
delimiter
CREATE PROCEDURE sp_var02()
BEGIN
set @nick_name = 'WR';
end
call sp_var02();
select @nick_name
delimiter
CREATE PROCEDURE sp_var_into()
begin
select d.dname into @deptnames from dept d where d.deptno = 2;
end
call sp_var_into()
select @deptnames
delimiter $$
CREATE PROCEDURE sp_param01(in nickname VARCHAR(32))
BEGIN
set @user_age = nickname;
end $$
call sp_param01('zhuyidana')
SELECT @user_age
delimiter $$
CREATE PROCEDURE sp_param02(IN dept_loc VARCHAR(64),OUT dept_name VARCHAR(32))
BEGIN
SELECT dname into dept_name from dept d where d.db_source = dept_loc;
end $$
call sp_param02('db03',@dept_name);
select @dept_name;
DROP PROCEDURE sp_param01_inout;
delimiter $$
CREATE PROCEDURE sp_param01_inout(in dept_loc VARCHAR(64),inout dept_name VARCHAR(32))
BEGIN
SELECT dept_name;
SELECT dname into dept_name FROM dept d where db_source = dept_loc;
END $$
set @dept_name = 'HELLO ';
CALL sp_param01_inout('db03',@dept_name);
SELECT @dept_name
CREATE table emp(
empno int,
ename VARCHAR(64),
job VARCHAR(64),
mgr VARCHAR(64),
hiredate date,
sal DOUBLE(6,2),
comm DOUBLE(6,2),
deptno int
)
INSERT INTO emp VALUES
(7369,'smith','clerk',7902,'1980-12-17',800.00,250.00,20),
(7499,'allen','salesman',7698,'1981-12-17',1600.00,300.00,30),
(7521,'ward','salesman',7698,'1982-12-17',1250.00,400.00,30),
(7566,'jones','manager',7839,'1981-02-04',2975.00,400.00,30),
(7654,'martin','salesman',7698,'1981-09-28',1250.00,500.00,30),
(7698,'blake','manager',7839,'1981-05-01',2850.00,500.00,30),
(7782,'clark','manager',7839,'1981-06-09',2450.00,500.00,10),
(7839,'king','president',7839,'1971-11-17',5000.00,500.00,10),
(7844,'turner','salesman',7698,'1981-09-08',1500.00,0.00,30),
(7900,'james','clerk',7698,'1981-12-03',950.00,0.00,30),
(7902,'ford','analyst',7566,'1981-12-03',3000.00,0.00,20),
(7934,'miller','clerk',7782,'1982-01-23',1300.00,0.00,10)
SELECT * from emp
select timestampdiff(year,e.hiredate,now()) from emp e where e.empno = '7499'
delimiter $$
CREATE PROCEDURE sp_hire_if()
BEGIN
declare result VARCHAR(32);
declare years int;
select timestampdiff(year,e.hiredate,now()) into years from emp e where e.empno = '7499';
if timestampdiff(year,'2001-01-01',now())>40
then set result = '元老';
ELSEIF timestampdiff(year,'2001-01-01',now())>38
then set result = '老员工';
ELSE
set result = '新手';
end if;
SELECT result;
end $$
call sp_hire_if()
delimiter $$
CREATE PROCEDURE sp_hire_if2()
BEGIN
declare result VARCHAR(32);
declare years int;
select timestampdiff(year,e.hiredate,now()) into years from emp e where e.empno = '7499';
if years > 40
then set result = '元老';
ELSEIF years > 38
then set result = '老员工';
ELSE
set result = '新手';
end if;
SELECT result;
end $$
call sp_hire_if2();
DROP PROCEDURE sp_flow_loop
delimiter
CREATE PROCEDURE sp_flow_loop()
BEGIN
declare c_index int default 1;
num_loop:loop
SELECT c_index;
if c_index >= 10
then leave num_loop;
end if;
set c_index = c_index+1;
end loop num_loop;
end
delimiter ;
call sp_flow_loop();
delimiter
create PROCEDURE sp_flow_loop02()
BEGIN
declare c_index int default 1;
DECLARE result_str VARCHAR(256) default '1';
cnt:loop
set c_index = c_index + 1;
set result_str = concat(result_str,',',c_index);
if c_index < 10 then
iterate cnt;
end if;
leave cnt;
end loop cnt;
SELECT result_str;
end
delomiter ;
call sp_flow_loop02();
DROP PROCEDURE sp_flow_repeat
delimiter
CREATE PROCEDURE sp_flow_repeat()
BEGIN
declare c_index int default 1;
declare result_str varchar(256) default '1';
count_lab:repeat
set c_index = c_index+1;
set result_str = CONCAT(result_str,',',c_index);
until c_index>=10
end repeat count_lab;
SELECT result_str;
end
delimiter ;
call sp_flow_repeat();
delimiter
CREATE PROCEDURE sp_flow_repeat2()
BEGIN
declare c_index int default 1;
declare result_str varchar(256) default '1';
count_lab:repeat
set c_index = c_index + 1;
set result_str = CONCAT(result_str,',',c_index);
until c_index>=10
end repeat count_lab;
SELECT result_str;
end
call sp_flow_repeat2();
delimiter
CREATE procedure sp_flow_while()
BEGIN
declare c_index int default 1;
declare result_str VARCHAR(256) DEFAULT '1';
WHILE c_index<10 DO
set c_index = c_index +1;
set result_str = CONCAT(result_str,',',c_index);
end while;
select result_str;
end
call sp_flow_while();
CREATE TABLE dept2(
deptno VARCHAR(64),
dname VARCHAR(64),
loc varchar(64)
)
INSERT into dept2() VALUES
(10,'ACCOUNTING','NEW YOKE'),
(20,'RESEARCE','DALLAS'),
(30,'SALES','CHICAGO'),
(40,'OPERATIONS','BOSTON')
select e.empno,e.ename,e.sal from emp e,dept2 d where e.deptno = d.deptno and d.dname = 'ACCOUNTING'
DROP PROCEDURE sp_show_emp
delimiter
CREATE PROCEDURE sp_show_emp(in dept_name VARCHAR(32))
BEGIN
declare e_no int;
declare e_name VARCHAR(32);
declare e_sal decimal(7,2);
declare emp_cursor cursor for
select e.empno,e.ename,e.sal
from emp e,dept2 d
where e.deptno = d.deptno and d.dname = dept_name;
open emp_cursor;
fetch emp_cursor into e_no,e_name,e_sal;
select e_no,e_name,e_sal;
fetch emp_cursor into e_no,e_name,e_sal;
select e_no,e_name,e_sal;
close emp_cursor;
end
delimiter ;
call sp_show_emp('ACCOUNTING');
DROP PROCEDURE sp_show_emp2
delimiter
CREATE PROCEDURE sp_show_emp2(in dept_name VARCHAR(32))
BEGIN
declare e_no int;
declare e_name VARCHAR(32);
declare e_sal decimal(7,2);
declare lp_flag boolean default true;
declare emp_cursor cursor for
select e.empno,e.ename,e.sal
from emp e,dept2 d
where e.deptno = d.deptno and d.dname = dept_name;
declare continue handler for 1329 set lp_flag = false;
open emp_cursor;
emp_loop:loop
fetch emp_cursor into e_no,e_name,e_sal;
if lp_flag then
SELECT e_no,e_name,e_sal;
else
leave emp_loop;
end if;
end loop emp_loop;
set @end_falg='end';
close emp_cursor;
end
delimiter ;
call sp_show_emp2('ACCOUNTING');
SELECT @end_falg
DROP PROCEDURE high_sal3;
delimiter
CREATE PROCEDURE high_sal3(in dept_name VARCHAR(32))
BEGIN
declare e_no int;
declare e_name VARCHAR(32);
declare e_sal decimal(7,2);
declare flag boolean default true;
declare emp_cursor cursor for
select e.empno,e.ename,e.sal
from emp e,dept2 d
where e.deptno = d.deptno and d.dname = dept_name;
declare continue HANDLER for not found set flag=FALSE;
open emp_cursor;
emp_loop:loop
fetch emp_cursor into e_no,e_name,e_sal;
if flag then
if e_name = 'king' then
iterate emp_loop;
else
update emp e set e.sal = e.sal + 100 where e.empno = e_no;
end if;
else
leave emp_loop;
end if;
end loop emp_loop;
set @end_falg = 'exit_flag';
close emp_cursor;
end
delimiter ;
call high_sal3('ACCOUNTING');