Oracle存储过程编程详解
什么是存储过程?
是一个可以用编程的方式来操作SQL的集合。
存储过程的优点?
执行效率很高,因为存储过程是预编译的,即创建时编译,而SQL语句是执行一次,编译一次。调用存储过程可以大大减少同数据库的交互次数。
降低网络通信量,因为存储过程执行的时候,只需要call存储过程名,不需要传递大量的SQL语句。
有利于复用。
存储过程的缺点?
移植性非常差,如果在oracle上写的存储过程,移植到mysql需要修改。
代码可读性差,实现一个简单的逻辑,代码会非常长。
存储过程的用途?
造测试数据:可以使用存储过程,往表里造几百万条数据。
数据同步:两个表之间按照一定的业务逻辑进行数据同步。
数据挖掘。
存储过程注意事项?
数据量大的时候(10万+),一定要做压力测试,有些存储过程在大数据量的情况下才会出现问题。
如果插入或者更新的次数比较多,为了提高效率,可以执行一万次,再commit一次。
如果先插入记录,没有commit,再对这条记录进行更新,会引起死锁。如果先后对同一笔记录进行更新,又没有commit,也会引起死锁。因为后一条语句会等待前一条语句提交。如果出现这种情况,则需要一条条commit。
不要忘记在存储过程里写commit。
如何写存储过程?
Sql代码
--创建或者更新存储过程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;
一个简单的造数据存储过程
Sql代码
--往表里造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帐号解锁)。
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/oracle/897.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
Window下Oracle Database 11g 发行
时间:2020-12-29
-
Oracle如何实现like多个值的
时间:2020-12-29
-
maven添加oracle依赖失败问题
时间:2020-12-29
-
OracleRAC基本概念及入门
时间:2020-12-29
-
Azure File Storage 基本用法
时间:2020-12-26
-
Oracle 权限(grant revoke)
时间:2020-12-26
-
Azure Queue Storage 基本用法
时间:2020-12-26
-
如何对比迁移前后的Orac
时间:2020-12-26
热门文章
-
Azure Queue Storage 基本用法 Azure Storage 之
时间:2020-12-26
-
Oracle存储过程编程详解
时间:2020-12-07
-
win10下oracle 11g安装图文教程
时间:2020-12-25
-
oracle 数据库学习 基本结构介绍
时间:2020-12-13
-
Azure File Storage 基本用法 Azure Storage 之 F
时间:2020-12-26
-
windows使用sqlpus连接oracle 数据库的教程图
时间:2020-12-25
-
Window下Oracle Database 11g 发行版2安装教程
时间:2020-12-29
-
Oracle解锁的方式介绍
时间:2020-12-14
-
linux下oracle设置开机自启动实现方法
时间:2020-12-13
-
Oracle学习记录之使用自定义函数和触发器
时间:2020-12-07
