MySQL 存储过程

以下是自己的一点学习记录
存储过程类似于 视图,但是存储过程中可以执行增删改查各种操作。通俗来讲,就是将 SQL 语句封装为一个函数的东西,我们要用的时候可以直接调用。

delimiter //
create PROCEDURE pq()
BEGIN
    SELECT * from student;
    insert into teacher(tname) VALUES("adsg");
END //
delimiter ; 

也可以传参数

# in 表示输入的参数
delimiter //
create procedure p1(
    in n1 int,
    in n2 int
)
BEGIN
    select * from student where sid > n1;
END //
delimiter ;

call p1(32,2)
# pymsql 的调用
cursor.callproc('p1',(13,2))

out 传出值

delimiter //
create procedure p3(
    in n1 int,
    out n2 int
)
BEGIN
    set n2 = 123123;
    select * from student where sid > n1;
END //
delimiter ;
# 创建一个 session 级别的变量
set @v1 = 10;
call p2(12,@v1)
# mysql 命令行中取返回值
select @v1;

set @_p3_0 = 12
set @_p3_1 = 2
call p3(@_p3_0,@_p3_1)
select @_p3_0,@_p3_1
# pymysql 中的调用,需要查询两次
cursor.callproc('p3',(12,2))
r1 = cursor.fetchall()
print(r1)
cursor.execute('select @_p3_0,@_p3_1')
r2 = cursor.fetchall()
print(r2)

out 是用于标识存储过程的执行结果

  • 存储过程中事务
delimiter \\
create PROCEDURE p5(
    OUT p_return_code tinyint
)
BEGIN 
  # 声明出现异常时的情况
  DECLARE exit handler for sqlexception 
  BEGIN 
    -- ERROR 
    set p_return_code = 1; 
    rollback; 
  END; 
 
  START TRANSACTION; 
    DELETE from tb1;
    insert into tb2(name) values('seven');
  COMMIT; 
 
  -- SUCCESS 
  set p_return_code = 2; 
 
  END\\
delimiter ;

这样在 Pymsql 中可以直接取到值,然后进行后续判断。

cursor.execute("select @_p5_0")
r = cursor.fetchall()
  • 存储过程中的游标操作
delimiter //
create procedure p6()
begin 
    declare row_id int; -- 自定义变量1  
    declare row_num int; -- 自定义变量2 
    declare done INT DEFAULT FALSE;
    declare temp int;

    declare my_cursor CURSOR FOR select id,num from A;
    declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    open my_cursor;
        xxoo: LOOP
            fetch my_cursor into row_id,row_num;
            if done then 
                leave xxoo;
            END IF;
            set temp = row_id + row_num;
            insert into B(number) values(temp);
        end loop xxoo;
    close my_cursor;

end  //
delimter ;
  • 存储过程中防止 SQL 注入
delimiter \\
CREATE PROCEDURE p8 (
    in nid int
)
BEGIN
    set @nid = nid;
    PREPARE prod FROM 'select * from student where sid > ?';
    EXECUTE prod USING @nid;
    DEALLOCATE prepare prod; 
END\\
delimiter ;

你可能感兴趣的:(MySQL 存储过程)