什么是存储过程?
是一个可以用编程的方式来操作SQL的集合。
存储过程的优点?
- 执行效率很高,因为存储过程是预编译的,即创建时编译,而SQL语句是执行一次,编译一次。调用存储过程可以大大减少同数据库的交互次数。
- 降低网络通信量,因为存储过程执行的时候,只需要call存储过程名,不需要传递大量的SQL语句。
- 有利于复用。
存储过程的缺点?
- 移植性非常差,如果在oracle上写的存储过程,移植到mysql需要修改。
- 代码可读性差,实现一个简单的逻辑,代码会非常长。
存储过程的用途?
- 造测试数据:可以使用存储过程,往表里造几百万条数据。
- 数据同步:两个表之间按照一定的业务逻辑进行数据同步。
- 数据挖掘。
存储过程注意事项?
- 数据量大的时候(10万+),一定要做压力测试,有些存储过程在大数据量的情况下才会出现问题。
- 如果插入或者更新的次数比较多,为了提高效率,可以执行一万次,再commit一次。
- 如果先插入记录,没有commit,再对这条记录进行更新,会引起死锁。如果先后对同一笔记录进行更新,又没有commit,也会引起死锁。因为后一条语句会等待前一条语句提交。如果出现这种情况,则需要一条条commit。
- 不要忘记在存储过程里写commit。
如何写存储过程?
- --创建或者更新存储过程update_user_p
- create or replace procedure update_user_p(param1 in varchar2) is
- v_taskName VARCHAR2(20); --定义变量,Oracle类型。
- v_i number(12);
- --将User_Advisor_Log表的结果集赋给cur
- CURSOR cur IS
- SELECT * FROM User_Advisor_Log;
- --sql开始标记,以上是定义变量,以下才写程序
- begin
- DBMS_OUTPUT.PUT_LINE(param1);
- v_i := 0;
- DBMS_OUTPUT.PUT_LINE('start!');
- --遍历结果集
- for cur_result in cur LOOP
- begin
- v_taskName := cur_result.TASK_NAME; --将结果集赋给变量v_creator,一个语句结束需要分号结尾。
- --if语句开始
- if v_taskName > 0 then
- begin
- NULL; --NULL 语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
- end;
- end if;
- --while循环
- while v_taskName > 0 LOOP
- begin
- NULL;
- end;
- end LOOP;
- --建议每循环一万次提交一下
- v_i := v_i + 1;
- if mod(v_i, 10000) = 0 then
- commit;
- end if;
- --有异常输出,或者在这里回滚
- exception
- when others then
- DBMS_OUTPUT.PUT_LINE('update_user_p has error!');
- end;
- end LOOP; --循环结束
- commit;
- DBMS_OUTPUT.PUT_LINE('end and commit!');
- end update_user_p;
一个简单的造数据存储过程
- --往表里造40万数据。
- create or replace procedure vas_create_acookie_data_p is
- v_i number(12);
- begin
- v_i := 0;
- while v_i < 400000 LOOP
- begin
- insert into TableName (GMT_CREATED,
- CREATOR,
- GMT_MODIFIED,
- MODIFIER,
- MEMBER_ID)
- values
- (sysdate, 'sys', sysdate, 'sys', v_i);
- v_i := v_i + 1;
- end;
- end LOOP;
- commit;
- end vas_create_acookie_data_p;
如何执行存储过程?
执行存储过程:call update_user_p('this is param')。在output 里可以看见DBMS_OUTPUT.PUT_LINE的输出。
如何调试存储过程?
在plsql里编辑存储过程,点击执行,系统会告诉你,错误的行数和原因。并能显示代码结构。
另外可以使用DBMS_OUTPUT.PUT_LINE打印异常,注意打印异常时,输出上下文(如错误的taskName)。
性能测试
- 用存储过程插入40万数据用了10秒。
- 遍历并判断40万条数据用了25秒。
- 80万次SQL判断+40万次SQL插入=25秒。
其他问题
- 存储过程执行非常慢,有可能是更新语句引起了死锁,也有可能是语句执行慢(需要建索引)。
- 存储过程编译非常慢,有可能是当前存储过程正在执行,被锁住了。(使用DBA帐号解锁)。
相关推荐
Oracle存储过程基础知识; Oracle存储过程的基本语法; 用Java调用Oracle存储过程总结; 在存储过程中做简单动态查询; Oracle存储过程调用Java方法; Oracle高效分页存储过程实例
DB存储过程开发基础知识PPT课件.pptx
本篇文章,小编将为大家介绍关于SQL 存储过程入门基础(基础知识),有需要的朋友可以参考一下
DB存储过程开发基础知识PPT学习教案.pptx
Oracle存储过程基础知识 Oracle存储过程的基本语法 Oracle存储过程的若干问题备忘 用Java调用Oracle存储过程总结 在存储过程中做简单动态查询 Oracle存储过程调用Java方法
oracle存储过程 基础知识大全 oracle存储过程分享 实用指数五颗星哈
DB2存储过程的入门实例文档,介绍DB2存储过程的基本知识
Oracle的存储过程基础知识的介绍,希望对大家有用!
二、使用存储过程优点 三、存储过程结构 四、参数定义 五、变量定义 六、赋值语句 七、条件控制语句 八、循环语句 九、常用操作符 十、游标使用 十一、异常处理 十二、SESSION临时表 十三、常用函数 十四、数据一致...
Oracle存储过程基本知识,存储过程的调用,存储过程的维护等
介绍了oracle存储过程的实现、存储过程的调用和触发器语法及实例的基础知识
Oracle 存储过程基础知识............................................................................................................... 1 Oracle 存储过程的基本语法.........................................
这些MySQL面试题涵盖了数据库设计、存储过程和触发器、数据库复制和集群等方面的知识点,测试了面试者的MySQL数据库基础知识、问题解决能力和实际应用能力。 通过回答这些问题,面试者可以展现自己熟练掌握MySQL...
oracle存储过程基础知识 系统整理及例子。
计算机的应用 科学计算(数值计算) 如:气象预报、卫星轨道计算、宇宙飞船的研制等 信息处理 如数据处理等 过程控制 如数控机床等 计算机应用基础知识(共59张PPT)全文共59页,当前为第9页。 计算机的应用 计算机...
语法入门、操作plsql、存储过程、函数、触发器、游标、包、返回类型;一个execle表轻松搞定。
学习SQL Server存储过程入门例子详解,入门必看的基本知识,需要仔细加以研究哦