MySQL --- 存储过程与游标简单使用
发布时间:2025-05-13 18:15:40 发布人:远客网络
一、MySQL --- 存储过程与游标简单使用
1、MySQL中存储过程与游标的简单使用如下:
2、存储过程的使用:定义存储过程:在MySQL中,存储过程是一个预编译的SQL代码块,可以通过CREATE PROCEDURE语句来定义。存储过程可以接受输入参数,并返回输出参数或结果集。局部变量:在存储过程内部,可以使用DECLARE语句定义局部变量。这些变量用于在存储过程中存储临时数据。例如,定义一个布尔变量taxable来判断是否需要增加税。逻辑判断:使用IF语句根据条件执行不同的操作。在示例中,IF语句用于检查taxable变量是否为真,如果为真,则在计算合计时增加营业税。返回结果:可以通过输出参数或结果集将存储过程的结果返回给调用者。在示例中,将计算结果存储在局部变量ototal中,并将其作为输出参数返回。
3、游标的使用:定义游标:游标允许在执行过程中逐行处理数据,而无需一次性加载整个结果集。可以使用DECLARE CURSOR语句来定义游标。打开游标:在使用游标之前,需要先打开它。使用OPEN语句可以打开游标。获取数据:使用FETCH语句逐个获取游标中的行数据。可以将获取的数据存储在局部变量中,以便后续处理。关闭游标:在使用完游标后,需要关闭它。使用CLOSE语句可以关闭游标。
4、示例:创建一个存储过程,用于计算特定顾客的订单合计,并根据情况增加营业税。在存储过程中,使用局部变量来存储合计和税信息,使用IF语句进行逻辑判断。创建一个表来存储订单数据,并在存储过程中使用游标逐行处理订单数据。对于每个订单,调用另一个存储过程来计算带税合计,并将结果插入到结果表中。通过这种方式,可以实现高效的数据处理,同时保持代码的清晰和可维护性。
5、注意事项:在使用存储过程和游标时,需要注意事务管理和错误处理,以确保数据的完整性和一致性。合理使用注释和文档来提高代码的可读性和可维护性。
二、Mysql事务操作失败如何解决
事务的原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做。
要实现事务的原子性,单单靠一条commit或是rollback命令还是不行的,因为例如commit命令它只是将一个事务中执行成功的DML语句提交给数据库里。如果要实现事务的原子性,则就需要commit和rollback命令配合上程序上的一个业务逻辑才能可以,具体业务逻辑代码如下示例代码:
程序中打开了事务进行插入,但是没有commit,表中的数据已经存在,就是回滚也不能删除插入的数据
本表的Storage Engine为myisam,不是innoDB,不支持事务处理 rollback()
使用 alter table xxxx engine= innoDB;将表改为 InnoDB引擎,结果回滚正常。
Connection conn= null;//连接对象
PreparedStatement pstmt= null;//预编译的SQL语句对象
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test";
conn= DriverManager.getConnection(url,"root","");
// conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ);
//设置自动提交为false,开始事务
String sql="INSERT INTO user_info(username,password,age)values(?,?,?)";
pstmt= conn.prepareStatement(sql);
//绑定参数,执行更新语句,将张三的账户金额减去1000元
pstmt.setString(1,"zhangui");
//绑定参数,执行更新语句,将李四的账户金额增加1000元
// pstmt.setString(1,"zzzzzzzzzzzzzzzzz");//绑定了非法参数
//pstmt.setString(2,"1111111111");
//pstmt.execute();//将抛出SQL异常
System.out.println("事务已提交,转账成功!");
System.out.println("事务回滚成功,没有任何记录被更新!");
System.out.println("回滚事务失败!");
if(pstmt!=null) try{pstmt.close();}catch(Exception ignore){}
if(conn!=null) try{conn.close();}catch(Exception ignore){}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:Mysql事务处理详解通过实例分析MySQL中的四种事务隔离级别解决Mysql收缩事务日志和日志文件过大无法收缩问题mysql的存储过程、游标、事务实例详解PHP mysqli事务操作常用方法分析MySQL四种事务隔离级别详解NodeJs使用Mysql模块实现事务处理实例MySQL数据库事务隔离级别详解MySQL事务的基础学习以及心得分享
三、MySQL 游标的定义与使用
从字面可以这么理解什么是游标,游标就像是水面上漂浮的一个标记,这个标记可以来回游动,一会游到这里一会游到那里,这里的河水可以理解为是数据的集合,这个标记就是在这些数据间来回游动。
为什么 MySQL会有游标这个概念,由于 SQL语言是面向集合的语句,它每次查询出来都是一堆数据的集合,没有办法对其中一条记录进行单独的处理。如果要对每条记录进行单独处理就需要游标。
游标其实就像是编程语言中的 for/foreach循环,把一个数组(数据的集合)中每条数据一条一条地循环出来,然后你在 for/foreach循环中使用判断语句对你感兴趣的数据进行处理。
哪里可以使用游标呢,函数,存储过程,触发器中都可以使用。
说完概念,就来看下游标的固定写法。不管概念是否理解,记住下面的固定模式也可以完成搬砖任务。
SELECT语句就是正常的查询语句,例如:SELECT id,age FROM table;
在打开游标之前,游标定义的 SQL语句是不执行的。
当 FETCH没有找到记录时会抛出异常,异常的定义需要下面的 HANDLER FOR语句。
声明游标语句中的 SELECT如果有多个字段,INTO后面需要多个变量进行接收。
这个语句的作用是指定一个条件,告诉程序所有数据已经循环完毕,可以结束了。由于游标是使用 WHILE循环进行每条数据的读取,就需要给 WHILE一个结束条件。
处理种类:可以是, EXIT立即结束。CONTINUE继续下面的处理。
异常的类型:一般指定为 NOT FOUND,意思是没有找到任何数据。
异常发生时的处理:当异常发生时需要做的事情,这里一般改变一个变量的值来记录异常已经发生了,如如 SET flat= 1详细用法查看下面的例子。
完毕,看懂没,如果没看懂没关系,游标处理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。