SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12)

SQL编程基础

A.编程环境:

 即存储过程、触发器和函数中进行SQL编程,所以有些语法并不能应用于普通的SQL应用场景,如命令行直接SQL查询。

B.变量声明:

(1)全局变量

声明:set @变量名 = 值;
读取:select @变量名
SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12)_第1张图片
赋值

  • set @变量名=表达式;
  • select @变量名:=表达式;-- 会输出结果集
  • select 表达式 into @变量名;–不输出结果集
(2)普通变量

声明:declare 变量名 类型 [default 默认值];
读取、赋值:同上

C.语句块

[lable_name:] BEGIN

    // 代码

   END [lable_name]

D.逻辑语句

MySQL支持两种判断,第一个是if判断,第二个 case判断

if语法
单分支
if 条件 then
    //代码
end if;

双分支
if 条件 then
    代码1
else
    代码2
end if;

多分支
if 条件 then
    代码1
elseif 条件 then
    代码2
else
    代码3
end if;

E.case语句

语法1:简单case函数

case sex
  when '1' then '男'
  when '2' then '女’
else '其他' end

语法2:case搜索函数

case when sex = '1' then '男'
         when sex = '2' then '女'
else '其他' end

F.循环语句

1.loop

语法:

lable_name:loop
	...
    leave lable_name --退出循环
    ...
end loop;
2.REPEAT

语法:

[lable_name:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [lable_name]

实例:

delimiter //
CREATE PROCEDURE ps_repeat ( p1 INT ) BEGIN
	SET @x = 0;
	REPEAT
			SET @x = @x + 1;
		UNTIL @x > p1 
	END REPEAT;
END //
3.while

语法:

while 条件 do
    //代码
end while;

实例:

delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
  WHILE p1 > 0 DO
    SET p1 = p1 - 1;
  END WHILE;
END//
4.游标

语法:
1.定义游标:declare 游标名 cursor for select语句;
2.打开游标:open 游标名;
3.获取结果:fetch 游标名 into 变量名[,变量名];
4.关闭游标:close 游标名;
实例:

delimiter //
create procedure p3()
begin
    declare value1 int;
    declare value2 int;
    -- 声明游标
    declare mc cursor for select id,name from old_tab;
    -- 打开游标
    open mc;
    -- 获取结果
    fetch mc into value1,value2;
    -- 这里是为了显示获取结果
    select value1,value2;
    -- 关闭游标
    close mc;  
end//

call p3

G.存储过程

 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集。存储在数据库中,经过第一次编译后再次调用不需要再次编译。可设定只有某些用户才具有对指定存储过程的使用权,这展现了其安全性。
(1)查看现有的存储过程。
语法:

SHOW  PROCEDURE  STATUS  [ LIKE ' pattern ' ] ;

实例:

show procedure status from mysql like '%p1%'

(2)创建存储过程
语法:
注意:delimiter是声明定界符,用以区分sql语句(;)和存储过程(//)结尾定界符
参数说明:参数分为 in 输入函数(默认) out输出函数 inout输入输出函数

delimiter //
CREATE PROCEDURE ps_name (参数1,参数2,参数3,...)
BEGIN
  sql代码
END//

实例:

delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
  WHILE p1 > 0 DO
    SET p1 = p1 - 1;
  END WHILE;
END//

 存储过程的参数分为输入参数(in)、输出参数(out)、输入输出参数(inout),默认是输入参数。如果存储过程中就一条语句,begin和end是可以省略的。

说明:

  • 存储过程中,可有各种编程元素:变量,流程控制,函数调用;

  • 还可以有:增删改查等各种mysql语句;

  • 其中select(或show,或desc)会作为存储过程执行后的"结果集"返回;

  • 形参可以设定数据的"进出方向":

(3)调用存储过程

语法:call 存储过程()

(4)删除存储过程

语法:drop procedure [if exists] 存储过程名

(5)存储过程典型案例

1.各种类型输入输出参数
实例:
SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12)_第2张图片
结过说明:除了in,传入的参数@a没有改变以外,out和inout都改变了传入的参数@b,@c

2.简单查询
实例:
SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12)_第3张图片

3.插入数据
实例:

delimiter //
drop procedure if exists insert1;
create procedure insert1()
begin
DECLARE i int;
set i = 0;
WHILE i<100 do 
insert into tab1(id,username) values(i,CONCAT('username',i));
set i = i+1;
end while;
end//

4.游标遍历插入
实例:

tip:	declare continue handler for not found set flag = 1;

delimiter //
create procedure p3()
begin
    declare value1 int;
    declare value2 int;
		declare value3 varchar(32);
		declare flag int default 0;
    -- 声明游标
    declare mc cursor for select * from old_tab;
		declare continue handler for not found set flag = 1;
	
    -- 打开游标
    open mc;
		l1:loop
    fetch mc into value1,value2,value3;
		if flag=1 then
			leave l1;
			end if;
      insert into new_tab values(value2,value3,value1);
    -- 这里是为了显示获取结果
    -- 关闭游标
		end loop;
    close mc;  
			
end//

call p3

5.综合实例:变量,select into 变量赋值,游标,循环
实例:

delimiter //
create procedure selecttab1()
begin
DECLARE i int;
declare username VARCHAR(255);
-- 定义游标
declare selecttab1_cursor CURSOR for select id, username from tab1 ;
-- 打开游标
open selecttab1_cursor;
-- 首次填充数据到变量
FETCH next from selecttab1_cursor into i,username;
-- 循环游标
read_loop: LOOP
select i,username;
-- 再次填充数据到变量
FETCH next from selecttab1_cursor into i,username;
END LOOP;
-- 关闭游标
close selecttab1_cursor;
end//

6.存储过程动态执行sql

delimiter //
create procedure dongtaisql()
begin
declare v_sql varchar(500); -- 需要执行的SQL语句 
DECLARE i int;
set i = 0;
WHILE i<10 do 
set v_sql= concat('insert into tab2(id,username) values(',i,', \'username',i,'\');'); 
set @v_sql=v_sql; -- 注意很重要,将连成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
prepare stmt from @v_sql; -- 预处理需要执行的动态SQL,其中stmt是一个变量 
EXECUTE stmt; -- 执行SQL语句 
deallocate prepare stmt; -- 释放掉预处理段 
set i = i+1;
end while;
end//

H.函数

(1)创建函数
语法:

create function 函数名(参数,参数的类型) returns 返回值类型

begin

    //代码

end

实例:

create function fun1() returns int
begin 
    declare c int;
    select id from old_tab into c;
    return c;
end;

(2)mysql内置函数
参考:mysql函数参考手册

I触发器

(1)简介

  • 触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。

  • 触发器必须定义在特定的表上。

  • 自动执行,不能直接调用,

  • 作用:监视某种情况并触发某种操作。

(2)触发器四要素
SQL编程:存储过程、触发器、函数(实例基于MySQL5.7.12)_第4张图片
(4)创建触发器

语法:

create trigger trigger_name

after/before insert /update/delete on 表名

for each row

begin

// 代码

end

实例:

delimiter // 
CREATE TRIGGER tr_new_tab_insert 
after insert on new_tab 
for Each row
begin 
insert into old(id,name,valid) values(new.id,new.name,new.valid); 
end //

提示:new.字段名 可以访问新值,old.字段名可以访问旧值。

(5)查看触发器

语法: show triggers

(6)删除触发器

语法:drop trigger trigger_name

你可能感兴趣的:(数据库,java)