oracle存储过程----入门存储过程

  从今天开始,决定先学会写存储过程吧,总是被人问起这个。
  首先,我决定以学会oracle 的存储过程为目标了。
  用的客户端是oracle sql developer
存储过程

  百度百科中的定义是,存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的 PL/SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
  提示下,PL/SQL 可不是PL/SQL Developer ,前者是oracle 的一种结构性语言,后者只不过是一个工具,不要一听说要学PL/SQL ,就很吃惊的说学个工具有什么用? 这样的疑问,因为它们俩不过是名字差不多而已。

存储过程的优点如下:
  • 降低网络的通讯量。如果只是执行简单的SQL语句的话存储过程和普通SQL没有太大差别,但随着时间的推移SQL量越来越大甚至达到上百行时,其优越性明显体现。
  • 提高执行效率。我们都知道SQL是先编译再执行的,而存储过程是预编译在服务器中的,当执行的时候跳过编译的环节效率自然会提高。
  • 可维护性高。可实现模块化的程序设计,存储过程可以多次调用,提供统一的数据库访问接口,更新存储过程通常比更新,测试,重新部署需要较少的时间和精力。
  • 简化操作流程。存储过程可以封装复杂的数据库操作,简化操作流程,例如对多个表的更新,删除等。
存储过程的缺点如下:
  • 数据库移植不方便。存储过程依赖与数据库管理系统, SQL Server 存储过程中封装的操作代码不能直接移植到其他的数据库管理系统中。
  • 不支持面向对象的设计。无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架。
  • 代码可读性差,不易维护。不支持集群。

  总之存储过程是一个SQL提供的一个非常优秀的功能,在工作中我们或多或少都会用到,学会存储过程绝对会让你受益匪浅。

1、写一个输出hello word的存储过程

  对于我们来说,学习新的语言,一定要先学会它的hello word 打印语句,哈哈。

create or replace procedure test_procedure
AS
begin
dbms_output.put_line('hello word');
END;

执行之后,sql面板会出现:

PROCEDURE TEST_PROCEDURE 已编译

  从上边的例子,我学习到了存储过程的名词是procedure ,创建存储过程的写法类似创建触发器 ,打印语法是dbms_output.put_line()
  另外BEGINEND 是成对出现,不区分大小写,as 不能省略。

  因为我是用的oracle sql developer,当编译成功 后,可以在下边位置,刷新后,看到你的第一个存储过程。这个与创建完触发器序列 一样,都能在相应的地方看到一样的结果。
oracle存储过程----入门存储过程_第1张图片

  既然创建完了存储过程 ,那就是运行了,运行有如下的写法:

set serveroutput on; --oracle sql developer的话需要加这一行
begin
test_procedure;
end;

  当然也可以这样执行:

set serveroutput on; --oracle sql developer的话需要加这一行
execute test_procedure;

  如果你们用的是oracle sql developer 工具的话,不加set serveroutput on; 这一行,sql输出面板 一直会提示匿名块已完成 ,加上,选中,直接运行,就可以了。

2、写一个接收传入参数的存储过程

  对于传入参数,就是在存储过程名 后边多加了括号,里边写明参数,如下边的写法一样,传入参数可以写为in ,如果没有加in ,则默认为传入参数。
  写法如下:

-- create or replace procedure test_procedure(a int,b String)
-- create or replace procedure test_procedure(a int,b string)
-- create or replace procedure test_procedure(a number,b string)
create or replace procedure test_procedure(a in number,b in varchar)
AS
begin
--输出值的时候要加||
dbms_output.put_line('第一个存储过程a的值:' || a); 
dbms_output.put_line('第一个存储过程b的值:' || b); 
end;

  就像java 里边的方法写法一样,在存储过程名 后边多加了括号,另外,发现以上四种写法都能通过编译,并正常执行。注意括号内,参数类型是写在后边。
  执行语句如下:

set serveroutput on; --oracle sql developer的话需要加这一行
execute test_procedure(1,'凌大大');

2、写一个传出参数的存储过程

  下边这个是能从存储过程中获取到返回值的例子。b 作为输出参数,并在存储过程中对其赋值33 返回。

create or replace procedure test_procedure(a in number,b out varchar)
AS
begin
  b:='33'; --这是赋值语句
dbms_output.put_line('第一个存储过程a的值:' || a); --输出值的时候要加||
end;

  在oracle sql developer 中执行如下内容就可以输出33

set serveroutput on;
DECLARE
i varchar(10);  --这里错误写成了varchar,忘了加长度
begin
test_procedure(1,i);
dbms_output.put_line(i);
end;

  在调用传出参数的时候,发现必须要定义变量,即DECLARE i varchar(10) ,定义完变量后再传到存储过程 中,执行完存储过程后,这个i 上就会有执行后的值,接着再输出,即可看到结果。
  上边这个把我给坑了,当时不管怎么执行都报错,后来找了个大神看了下,原来我上边i varchar(10) ,错误写成了i varchar ,没有定义长度,看来,存储过程在括号里边定义的时候,不需要加长度,但是在定义变量的时候,必须要有长度。
  下一篇我觉得,该去了解下存储过程中有的变量。oracle存储过程—-变量的介绍及使用(PL/SQL)

你可能感兴趣的:(sql存储过程)