【MYSQL】MYSQL存储过程

存储过程就相当于编程语言里的函数,而它是mysql的函数

存储过程的简单创建:

delimiter $$ #先修改结束符,否则一遇到;就会结束语句导致创建不成功
create procedure f1() #创建一个没有参数的f1的存储过程
BEGIN#标志可以开始写函数体了
    select * from text;
END$$
delimiter;#把结束符修改回来

调用储存过程:

call f1();

 

存储过程,可以接收参数,其参数有三类:

  • in          仅用于传入参数用
  • out        仅用于返回值用
  • inout     既可以传入又可以当作返回值
--创建有参数的存储过程
delimiter $$
create procedure f1(
    in    i1    int,
    out    o1  int,
    inout     io1    int,
)
BEGIN
    DECLARE    tem  int ;--定义储存过程int类型的局部变量
    DECLARE    tem1 int  default 0; --定义储存过程int类型的局部变量,默认值为0
    set tem=10;
    set tem1=20;
    set o1=i1+tem+tem1;
    set io1=i1+o1+io1=tem+tem1;
END$$
delimiter;

--执行储存过程查看结果
set @a=1;--创建并定义一个用户变量,用户变量当用户还连着mysql它都会存在
set @b=2;
set @c=3;
call f1(@a,@b,@c)
select @b,@c

事务:

delimiter \\
                        create PROCEDURE p1(
                            OUT p_return_code tinyint
                        )
                        BEGIN 
                          DECLARE exit handler for sqlexception 
                          BEGIN 
                            -- ERROR 
                            set p_return_code = 1; 
                            rollback; 
                          END; 
                         
                          DECLARE exit handler for sqlwarning 
                          BEGIN 
                            -- WARNING 
                            set p_return_code = 2; 
                            rollback; 
                          END; 
                         
                          START TRANSACTION; 
                            DELETE from tb1;
                            insert into tb2(name)values('seven');
                          COMMIT; 
                         
                          -- SUCCESS 
                          set p_return_code = 0; 
                         
                         END\\
                    delimiter ;

游标:

delimiter //
                    create procedure p3()
                    begin 
                        declare ssid int; -- 自定义变量1  
                        declare ssname varchar(50); -- 自定义变量2  
                        DECLARE done INT DEFAULT FALSE;


                        DECLARE my_cursor CURSOR FOR select sid,sname from student;
                        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
                        
                        open my_cursor;
                            xxoo: LOOP
                                fetch my_cursor into ssid,ssname;
                                if done then 
                                    leave xxoo;
                                END IF;
                                insert into teacher(tname) values(ssname);
                            end loop xxoo;
                        close my_cursor;
                    end  //
                    delimter ;

动态执行SQL:

delimiter \\
                    CREATE PROCEDURE p4 (
                        in nid int
                    )
                    BEGIN
                        PREPARE prod FROM 'select * from student where sid > ?';
                        EXECUTE prod USING @nid;
                        DEALLOCATE prepare prod; 
                    END\\
                    delimiter ;


删除储存过程:

drop procedure proc_name;

pymysql执行存储过程:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行存储过程
cursor.callproc('p1', args=(1, 22, 3, 4))
# 获取执行完存储的参数
cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
result = cursor.fetchall()

conn.commit()
cursor.close()
conn.close()


print(result)

更多详情请戳https://www.cnblogs.com/wupeiqi/articles/5713323.html

 

posted @ 2017-09-15 10:07  丰study  阅读(161)  评论(1)    收藏  举报