加入收藏
大学数学, 研究生数学,大学数学资料下载,免费 大学数学课件,研究生数学课件,免费下载
Oracle存储过程基础和实例
2015-11-22 14:27:51

存储过程特点

1)存储过程是预编译过的,并且经优化后存储于SQL内存中,使用时无需再次编译,提高了工作效率;
2)存储过程的代码直接存放于数据库中,一般由客户端直接通过存储过程的名字进行调用,减少了网络流量,加快了系统执行速度,例如在进行百万以上的大批量数据查询时,使用存储过程分页要比其他方式分页快得多;
3)使用存储过程可以减少SQL注入式攻击,提高了系统的安全性,执行存储过程的用户要具有一定的权限才能使用存储过程,没有数据操作权限的用户只能在其控制下间接地存取数据;
4)在同时进行主、从表及多表间的数据维护及有效性验证时,使用存储过程比较方便,而且可以有效利用SQL中的事务处理的机制;
5)使用存储过程,可以实现存储过程设计和编码工作分开进行,只要将存储过程名、参数、及返回信息告诉编码人员即可;
6)但使用存储过程封装业务逻辑将限制应用程序的可移植性;另外,如果更改存储过程的参数或者其返回的数据及类型的话,需要修改应用程序的相关代码,比较繁琐。
过程的语法结构

完整的过程结构如下: create or replace procedure 过程名 as 声明语句段; begin 执行语句段; exception 异常处理语句段; end;
过程是有名称的程序块,as关键词代替了无名块的declare.

创建名为stu_proc的过程,create是创建过程的标识符,replace表示若同名过程存在将覆盖原过程.该过程定义了一个变量,其类型和student数据表中的sname字段类型相同,都是字符型,将数据表中的sno字段为1的sname字段内容送入变量中,然后输出结果.

参数

SQL中调用存储过程语句:
call procedure_name();
调用时”()”是不可少的,无论是有参数还是无参数。
定义对数据库过程的调用时    无参数过程:{ call procedure_name}    仅有输入参数的过程:{call procedure_name(?,?...)}     这里?表示输入参数,创建存储过程时用in表示输入参数
   仅有输出参数的过程:{ Call procedure_name(?,?...)}     这里的?表示输出参数,创建存储过程时用out表示输入参数
   既有输入参数又有输出参数的过程            {call procedure_name(?,?...)}     这里的?有表示输出参数的,也有表示输入参数的 
下面将会对这4种情况分别举出实例!!!

无参数存储过程:
create or replace procedure stu_proc as
pname varchar2(25);
begin
  select sname into pname from student where sno=1;
  dbms_output.put_line(pname);
end;
或者
create or replace procedure stu_proc as
pname student.sname%type;
begin
  select sname into p_name from student where sno=1;
  dbms_output.put_line(pname);
end;

仅有输入参数的过程
create or replace procedure stu_proc1(pno in student.sno%type) as
pname varchar2(25);
begin
  select sname into pname from student where sno=pno;
  dbms_output.put_line(pname);
  end;

仅有输出参数的存储过程
create or replace procedure stu_proc2(pname out student.sname%type) as
begin
  select sname into pname from student where sno=1;
  dbms_output.put_line(pname);
  end;
此种存储过程不能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明

有输入\输出参数的存储过程:
create or replace procedure stu_proc3
(pno in student.sno%type,pname out student.sname%type) as
begin
  select sname into pname from student where sno=pno;
  dbms_output.put_line(pname);
  end;
此种存储过程不能直接用call来调用,这种情况的调用将在下面oracle函数调用中说明

Oracle函数调用存储过程

下面就针对参数的4种情况分别举出实例说明函数对存储过程的调用

函数调用存储过程实例

对无参数过程的调用:
 --函数
create or replace function get_pname return varchar2 is
  pname varchar2(20);
  begin
   stu_proc;
   select sname into pname from student where sno=1;
    return pname;
    end;
--调用
declare
begin
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname);
 end;

对有输入参数过程的调用:
create or replace function get_pname1(pno in number) return varchar2 is
  pname varchar2(20);
  begin
  stu_proc1(pno in student.sno%type)
  select sname into pname from student where  sno=pno;
    return pname;
    end;
--调用
declare
begin
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname1(2));
 end;

对有输出参数过程的调用:
 create or replace function get_pname2(pname out varchar2) return varchar2 is
  begin
  stu_proc2(pname out student.sname%type);
    return pname;
    end;
--调用
declare
pname student.sname%type;
begin
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname2(pname));
 end;

对有输入\输出参数过程的调用:
 create or replace function get_pname3(pno in number,pname out varchar2) return varchar2 is
  begin
 stu_proc3(pno in student.sno%type,pname out student.sname%type);
    return pname;
    end;
--调用
declare
pname student.sname%type;
begin
   dbms_output.put_line('在PL/SQL中打印的结果:'||get_pname3(2,pname));
 end;

赞一个(93) | 阅读(1101)
上一篇:Oracle查询优化
下一篇:Oracle存储过程的异常处理
 

胡桃木屋版权所有@2013 湘ICP备13006789号-1