存储过程 与 事务管理

来源:互联网 发布:saber软件芯片tl494 编辑:程序博客网 时间:2024/05/22 00:46

存储过程就是为以后使用所保存的一条或是多条SQL语句,类似批处理,虽然其作用不仅仅在于批处理。
使用原因:
1. 通过把处理封装在一个易用得到单元里,可以简化复杂的操作;
2. 简化对变动的管理,如果表名、列名或是业务逻辑有变化,那么只需要改变存储过程的代码,使用它的人甚至不需要知道这些变化;
3. 存储过程通常以编译过得形式存在,提高速度;

首先,执行存储过程比编写频繁,用EXCUTE来执行。

EXCUTE AddNewProduct('JTS01',                     'Stuffed Eiffel Tower',                     6.49,                     'Plush sthffed toy with the text La Tour Eiffel in red white and blue'); 

存储过程完成的工作有:
1. 验证传递的数据,保证所有的4个参数都有值;
2. 生成用作主键的ID;
3. 将新产品加到Products表中。

对具体的DBMS来说,可能包括以下的执行选择:
1. 参数可选,具有不提供参数时的默认值;
2. 不按次序给出参数,以“参数=值”的方式给出;
3. 输出参数,允许存储过程在正在执行的应用程序中更新所用的参数;
4. 用SELECT检索数据;
5. 返回代码,允许存储过程返回一个值到正在运行的应用程序

创建存储过程:

--对邮件发送清单中具有邮件地址的过程进行计数CREATE PROCEDURE MailingListCount(    ListCount OUT INTEGER)IS v_rows INTEGER;BEGIN    SELECT COUNT(*) INTO v_rows    FROM Customers     WHERE NOT cust_email IS NULL;    ListCount := v_rows;END;

这个存储过程有一个名为ListCount的参数,此参数从存储过程返回一个值,IN、OUT表示这个是传递值还是返回值,调用如下:

var ReturnValue NUMBEREXEC MailingListCount(:ReturnValue);SELECT ReturnValue;

事务处理
关系数据库把数据存储在多个表中,使数据更容易操作、维护和重用。例如Orders和OrderItems两个表,Orders存储实际的订单,OrderItems存储订购的各项物品。

所以给系统添加订单的过程如下:
1. 检查数据库中是否存在相应的顾客,如果不存在,添加;
2. 检索顾客ID;
3. 在Orders表中添加一行,他与顾客ID相关联;
4. 检索Orders表中赋予的新订单ID;
5. 未订购的每个物品在OrderItems中添加一行,通过检索出来的ID把他与Orders表关联(并且通过产品ID与Products表关联)

事务处理的几个术语:
1. 事务(transaction)值一组SQL语句;
2. 回退(rollback)指撤销指定的SQL语句的过程;
3. 提交(commit)指将未存储的SQL语句结果写入数据表;
4. 保留点(savepoint)指事务处理中设置的临时占位符(placeholder)可以对它发布回退(与回退整个事务处理不同);

事务处理可以管理UPDATE DELETE INSERT 语句,不能回退SELECT,也没有必要,也不能回退CREATE DROP操作。

使用事务处理可以管理成批执行的SQL操作,保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它们要么完全执行,要么完全不执行。

#MySQL&&MariaDB 设置事务,提交START TRANSACTION......COMMIT;#创建占位符(保留点)SAVEPOINT delete1;#回退全部ROLLBACK;#回退到某个占位符ROLLBACK TO delete1;

保留点越多越好

游标
SQL检索返回的是一个结果集,使用游标可以查看前一行或者后一行,不过游标(cursor)只能在存储过程中使用。
游标主要用于交互式应用,其中用户需要滚动屏幕中的数据,并对数据进行浏览或作出修改。
使用游标涉及几个明确地步骤:

  • 使用前,必须声明
  • 一旦声明,就必须打开游标以供使用。使用这个过程用前面定义的SELECT语句把实际数据检索出来。
  • 对于填有数据的游标,根据需要取出各行
  • 在结束游标使用时,必须关闭游标,可能的话,释放游标。
--创建游标CREATE CustCursor CURSORFOR SELECT * FROM CustomersWHERE cust_mail IS NULL;--使用游标OPEN CURSOR CustCursor;--使用FETCH访问游标数据,FETCH指出要检索哪些行FETCH NEXT FROM CustCursor    INTO .....--关闭游标CLOST CustCursor;
0 0
原创粉丝点击