Oracle中存储过程的作用和用法

Posted 闹闹S

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中存储过程的作用和用法相关的知识,希望对你有一定的参考价值。

  存储过程是Oracle开发者在数据转换或查询报表时经常使用的方式之一。它就是想编程语言一样一旦运行成功,就可以被用户随时调用,这种方式极大的节省了用户的时间,也提高了程序的执行效率。存储过程在数据库开发中使用比较频繁,它有着普通SQL语句不可替代的作用。所谓存储过程,就是一段存储在数据库中执行某种功能的程序。其中包含一条或多条SQL语句,但是它的定义方式和PL/SQL中的块、包等有所区别。存储过程可以通俗地理解为是存储在数据库服务器中的封装了一段或多段SQL语句的PL/SQL代码块。在数据库中有一些是系统默认的存储过程,那么可以直接通过存储过程的名称进行调用。另外,存储过程还可以在编程语言中调用,如Java、C#等。

存储过程的作用(优点):

  1. 简化复杂的操作。存储过程可以把需要执行的多条SQL语句封装到一个独立单元中,用户只需调用这个单元就能达到目的。这样就实现了一人编写多人调用。
  2. 增加数据独立性。与视图的效果相似,利用存储过程可以把数据库基础数据和程序(或用户)隔离开来,当基础数据的结构发生变化时,可以修改存储过程,这样对程序来说基础数据的变化是不可见的,也就不需要修改程序代码了。
  3. 提高安全性。使用存储过程有效降低了错误出现的几率。如果不使用存储过程要实现某项操作可能需要执行多条单独的SQL语句,而过多的执行步骤很可能造成更高的出现错误几率。
  4. 提高性能。完成一项复杂的功能可能需要多条SQL语句,同时SQL每次执行都需要编译,而存储过程可以包含多条SQL语句,而且创建后只需要编译一次,以后就可以直接调用。

存储过程语法:

  1. 创建语句:create or replace procedure 存储过程名。如果没有or replace语句,则仅仅是新建一个存储过程。如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。
  2. 存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复。参数的数据类型只需要指明类型名即可,不需要指定宽度。 参数的宽度由外部调用者决定。 存储过程可以有参数,也可以没有参数。
  3. 变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。 变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。
  4. 过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。
  5. 异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选 。
  6. 结束块:由end关键字结束。

存储过程的参数传递方式 :
  存储过程的参数传递有三种方式:IN,OUT,IN OUT .
  IN 按值传递,并且它不允许在存储过程中被重新赋值。如果存储过程的参数没有指定存参数传递类型,默认为IN 

 1 create or replace procedure proc1(   
 2   p_para1 varchar2,   
 3   p_para2 out varchar2,   
 4   p_para3 in out varchar2   
 5 )as    
 6  v_name varchar2(20);   
 7 begin   
 8   p_para1 :=aaa;   
 9   p_para2 :=bbb;   
10   v_name := 张三丰;   
11   p_para3 := v_name;   
12   dbms_output.put_line(p_para3:||p_para3);   
13   null;   
14 end; 

  OUT 参数:作为输出参数,需要注意,当一个参数被指定为OUT类型时,就算在调用存储过程之前对该参数进行了赋值,在存储过程中该参数的值仍然是NULL.

  IN OUT 是真正的按引用传递参数。即可作为传入参数也可以作为传出参数。



以上是关于Oracle中存储过程的作用和用法的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 存储过程中OUT参数的用法

MySQL存储过程 DELIMITER的作用及用法

oracle中的存储过程有啥作用,该怎么理解?(数据更新的话用update语句不就完了吗)

oracle的存储过程的作用

oracle数据库中,存储过程中 %rowtype 类型的用法有啥限制吗?

oracle的存储过程