是一个可以用编程的方式来操作SQL的集合。

1什么是存储过程?

是一个可以用编程的方式来操作SQL的集合。

2存储过程的优点?

执行效率很高,因为存储过程是预编译的,即创建时编译,而SQL语句是执行一次,编译一次。调用存储过程可以大大减少同数据库的交互次数。

降低网络通信量,因为存储过程执行的时候,只需要call存储过程名,不需要传递大量的SQL语句。

有利于复用。

3存储过程的缺点?

移植性非常差,如果在oracle上写的存储过程,移植到mysql需要修改。

代码可读性差,实现一个简单的逻辑,代码会非常长。

4存储过程的用途?

造测试数据:可以使用存储过程,往表里造几百万条数据。

数据同步:两个表之间按照一定的业务逻辑进行数据同步。

数据挖掘。

5存储过程注意事项?

数据量大的时候(10万+),一定要做压力测试,有些存储过程在大数据量的情况下才会出现问题。

如果插入或者更新的次数比较多,为了提高效率,可以执行一万次,再commit一次。

如果先插入记录,没有commit,再对这条记录进行更新,会引起死锁。如果先后对同一笔记录进行更新,又没有commit,也会引起死锁。因为后一条语句会等待前一条语句提交。如果出现这种情况,则需要一条条commit。

不要忘记在存储过程里写commit。

6如何写存储过程?

Sql代码

SQL | 复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
--创建或者更新存储过程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代码

SQL | 复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--往表里造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;

7如何执行存储过程?

执行存储过程:call update_user_p('this is param')。在output 里可以看见DBMS_OUTPUT.PUT_LINE的输出。

8如何调试存储过程?

在plsql里编辑存储过程,点击执行,系统会告诉你,错误的行数和原因。并能显示代码结构。

另外可以使用DBMS_OUTPUT.PUT_LINE打印异常,注意打印异常时,输出上下文(如错误的taskName)。

性能测试

用存储过程插入40万数据用了10秒。

遍历并判断40万条数据用了25秒。

80万次SQL判断+40万次SQL插入=25秒。

其他问题

存储过程执行非常慢,有可能是更新语句引起了死锁,也有可能是语句执行慢(需要建索引)。

存储过程编译非常慢,有可能是当前存储过程正在执行,被锁住了。(使用DBA帐号解锁)。

Oracle的存储过程编程的更多相关文章

  1. 编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)

    在本系列学习随笔中的第2节我们留下了2个问题,我们现在讨论在out参数中使用光标. 1.要在out参数中使用光标,我们需要申明一个包的结构,包的结构分为包头和包体,包头只负责申明,包体只负责实现.包头 ...

  2. 编程开发之--Oracle数据库--存储过程和存储函数(2)

    上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...

  3. PL/SQL存储过程编程

    PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  6. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  7. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  8. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  9. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

随机推荐

  1. 【原创】关于$test$plusargs和$value$plusargs的小结【SystemVerilog/Verilog】

    [原创]关于$test$plusargs和$value$plusargs的小结 Abtract $test$plusargs和$value$plusargs作为进行Verilog和SystemVeri ...

  2. 每日英语:Why Chinese Companies Lack Homegrown Luxury Brand Power

    Chinese companies build iPads, high-speed trains and world-class telecom gear, but they can't seem t ...

  3. CentOS6.4下Docker应用环境的部署配置

    http://blog.chinaunix.net/uid-619485-id-4973941.html *********************************************** ...

  4. cloudera-manager-installer.bin不生成repo文件

    [转] 运行cloudera-manager-installer.bin,并在后边增加参数使其不再在/etc/yum.repo.d/下生成cloudera-manager.repo文件 ./cloud ...

  5. sort-uniq-cut-join命令练习

    [root@linux Desktop]# cat> fruits.txt banana orange persimmon %%banana apple ORAGE cat> fruits ...

  6. jQuery 中 attr() 和 prop() 方法的区别<转>

    前几天,有人给 Multiple Select 插件 提了问题: setSelects doesn't work in Firefox when using jquery 1.9.0 一直都在用 jQ ...

  7. SpringBoot DataSource 配置说明

    DataSource 配置说明 属性 说明 spring.dao.exceptiontranslation.enabled 是否开启PersistenceExceptionTranslationPos ...

  8. phpadmin 装了6666端口只能在IE打开,在阿里云改了 开放端口85好了

    phpadmin 装了6666端口只能在IE打开,在阿里云改了 开放端口85好了 非常用端口谷歌浏览器识别不了phpadmin

  9. 让浏览器下载文件http头部

    网站提供下载服务时经常需要实现一个强制下载功能(即强制弹出下载对话框),并且文件名保持和用户之前上传时相同. 效果如下图:  Content-Disposition 使用 HTTP Header 的 ...

  10. JVM中的STW和CMS

    Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外).Java中一种全局暂停现象,全局停顿,所有Java代码停 ...