MySQL——储存过程

1、创建一个存储过程

delimiter //
CREATE PROCEDURE p1()
BEGIN
	SELECT * from user;
	INSERT into user(name,PASSWORD,email) VALUE("we","123","12312");
END //
delimiter ;

数据库调用执行:

call p1();

pycharm中执行语句:

cursor.callproc("p1")
rs1 = cursor.fetchall()
print(rs1)

2、带in关键词的参数传递

delimiter //
CREATE PROCEDURE p2(
	in n1 int
)
BEGIN
	SELECT * from user where id>n1;
END //
delimiter ;

数据库调用执行:

call p2(12);

pycharm中执行语句:

cursor.callproc("p2",(12,))
rs1 = cursor.fetchall()
print(rs1)

3、带out关键词的参数传递

delimiter //
CREATE PROCEDURE p3(
 	in n1 int,
 	out n2 INT
)
BEGIN
	SET n2 = 1213;
	SELECT * from user where id>n1;
END //
delimiter ;

数据库调用执行:

SET @v1 = 0;
CALL p3(5,@v1);
select @v1;

pycharm中执行语句:

cursor.callproc("p3",(5,10))
rs1 = cursor.fetchall()
print(rs1)
    # 用来拿到out关键词的值
cursor.execute("select @_p3_0,@_p3_1")
rs2 = cursor.fetchall()
print(rs2)

4、存储过程——事务

delimiter //
CREATE PROCEDURE p4(
	OUT re INT
)
BEGIN
	declare exit handler for SQLEXCEPTION
	BEGIN
		SET re = 1;
		ROLLBACK;
	END;
	
	DECLARE exit HANDLER for SQLWARNING	
	BEGIN
		SET re = 2;
		ROLLBACK;
	END;

	START TRANSACTION;
		UPDATE user set name="老三" WHERE id=5;
		INSERT into tb1(name) VALUES("老四");
	COMMIT;

	SET re = 0;
END //
delimiter ;

数据库调用执行:

SET @v1 = 0;
CALL p4(@v1);
select @v1;

pycharm中执行语句:

cursor.callproc("p4",(5,))
conn.commit()
cursor.execute("select @_p4_0")
rs = cursor.fetchall()
print(rs)

5、存储过程——循环

delimiter //
CREATE PROCEDURE p5()
BEGIN
	DECLARE ssid int;
	DECLARE ssname VARCHAR(50);
	DECLARE done INT DEFAULT FALSE;
	
	DECLARE my_cursor CURSOR FOR select id,name from user;
	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 tb1(name) VALUES(ssname);
		END LOOP xxoo;
	CLOSE my_cursor;
END //
delimiter;

数据库调用执行:

call p5();

pycharm中执行语句:

cursor.callproc("p5")
conn.commit()

6、动态SQL(防注入)

delimiter \\
CREATE PROCEDURE p6 (
	in nid int
)
BEGIN
	SET @nid = nid;
	PREPARE prod FROM 'select * from user where id > ?';
	EXECUTE prod USING @nid;
	DEALLOCATE prepare prod; 
END\\
delimiter ;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值