Oracle笔记之存储过程和函数

概述
本篇博文中主要探讨以下内容:
存储过程和存储函数
1. 匿名块
2. 命名块(存储过程)
3. 存储函数

Oracle中的存储过程和存储函数

  • 1.PL/Sql块
  • 2. 过程(procedure)
    • 2.1过程一(无参存储过程)
    • 2.过程二(有参存储过程)
    • 3.过程三(有参存储过程,且返回多个值)
    • 4.调用方法
    • 5.在存储过程中实现判断语句、多分支语句
    • 6.通过id 取工资(存储过程实例)
    • 7.删除存储过程
  • 3.存储函数
  • 4.存储过程和存储函数的区别:

1.PL/Sql块

--在用到dbms_output.put_line()函数之前先要设置,否则无法输出
 set serveroutput on;
--以下语句是输出一句话this is a test!
SQL> begin
   		 dbms_output.put_line('this is a test!');
    end;
    /

--使用declare用来声明变量
SQL> declare
   		 n number;
   	begin
   		 n:=90;--sql中给变量赋值要加冒号:
   		 dbms_output.put_line('n='||n);
    end;
    /

错误示范:
没有设置 set serveroutput on;
没有任何输出结果
Oracle笔记之存储过程和函数_第1张图片
设置 set serveroutput on;后
Oracle笔记之存储过程和函数_第2张图片
Oracle笔记之存储过程和函数_第3张图片

2. 过程(procedure)

1、一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值。
2、过程和函数都可以通过out指定一个或多个输出行。我们可以利用out参数,在过程和函数中实现返回多个值。
3、存储过程和存储函数都可以有out参数。
4、存储过程和存储函数都可以有多个out参数。
5、存储过程可以通过out参数来实现返回值。
6、如果只有一个返回值,用存储函数;否则,就用存储过程。

2.1过程一(无参存储过程)

1.创建无参存储过程p_my_first_proc

--创建无参存储过程p_my_first_proc (注意第一行最后要加as或者is)
create or replace procedure p_my_first_proc as 
begin
  dbms_output.put_line('this is my first produre!');
end;

2.执行p_my_first_proc

execute p_my_first_proc;

2.过程二(有参存储过程)

  1. 创建带有参数存储过程p_fac
--创建带有参数存储过程p_fac
create or replace procedure p_fac(n number) as 
begin
  dbms_output.put_line('n= '||n);
end;
  1. 执行p_fac
execute p_fac(199);

Oracle笔记之存储过程和函数_第4张图片

3.过程三(有参存储过程,且返回多个值)

  1. 创建一个可以返回多个值的存储过程p_fac
--创建一个可以返回多个值的存储过程p_fac
--通过out指定一个或多个输出行
create or replace procedure p_fac(n number,res out number) as 
begin
   res := n * 10;
end;

  1. 执行
var r number;
exec p_fac(10,:r);

Oracle笔记之存储过程和函数_第5张图片

4.调用方法

  1. 方法一
--调用方法一
var r number;
exec fac(10,:r);
  1. 方法二
--调用方法二
declare
  n number:=9;
  r number;
begin
  p_fac(n,r);
  dbms_output.put_line('r='||r);
end;

5.在存储过程中实现判断语句、多分支语句

  1. if语句
--if 
create or replace procedure p_max(a number,b number,m out number) as
begin
  if a > b then
    m := a;
  else
    m := b;
  end if;
end;
  1. 多分支 while 和 for
--多分支
--while
create or replace procedure p_sum(n number ,res out number) as
  i number:=1;
begin
  res := 0;
  while i <=n loop
    res := res + i;
    i := i+1;
  end loop;
end;

--for
create or replace procedure p_sum(n number,res out number) as  
begin
  res := 0;
  for i in 1..n loop
    res := res + i;
  end loop;
end;

--利用存储过程和while语句实现1-n之间的累加求和
create or replace procedure p_sum(n number,s out number) as 
   i number := 1;
begin
  s := 0;
  while true loop
    exit when i>n ;
    s := s +i;
    i := i + 1;
  end loop;
end;
--声明变量
var sum number;
exec(100,:sum);

6.通过id 取工资(存储过程实例)


--通过id 取工资
create or replace procedure getSalByEmpno(eno number,salary out number) is
begin
   select sal into salary from emp where empno = eno;
exception
   when NO_DATA_FOUND then
     RAISE_APPLICATION_ERROR(-20000,'该雇员不存在');
end;   
                   

--调用方式一 
declare
     salary number;
begin
     getSalByEmpNo(7654,salary);
     dbms_output.put_line('salary = ' || salary);
end;     


--调用方式二
declare
     sal number;
begin
    getSalByEmpno(salary=>sal,eno=>7654);
    dbms_output.put_line('salary = ' || sal);
end;


--查看原代码
 select * from user_source where name = upper('getSalbyempno');

7.删除存储过程

删除存储过程 DROP PROCEDURE 存储过程名字

--查看所有的存储过程和函数
select *From user_source;
--删除存储过程 p_test
drop procedure p_test;

3.存储函数

注意:函数是有返回值的
1.创建函数

--创建函数
--根据员工编号查出工资
create or replace function getSalByEmpno(eno number) return number as
   v_sal emp.sal%type;
begin
   select sal into v_sal from emp where empno = eno ;
   return v_sal;
exception
   when NO_DATA_FOUND then
     raise_application_error(-20000,'该雇员不存在');
end;


--调用一
var v_sal number;
exec :v_sal := getSalByEmpno(7900);


--调用二
 select getSalByEmpno(7900) from dual;


--显示错误
show errors
--或者
select * from user_errors;


--查看对象之间的依赖关系
select * from user_dependencies;

调用一
Oracle笔记之存储过程和函数_第6张图片

调用二Oracle笔记之存储过程和函数_第7张图片

  1. 删除函数
    删除函数 DROP FUNCTION 函数名字
drop function f_test;

4.存储过程和存储函数的区别:

存储函数有返回值,而存储过程没有返回值。

  1. 如果存储过程想实现有返回值的业务,我们就必须使用out类型的参数。
  2. 即便是存储过程使用了out类型的参数,起本质也不是真的有了返回值,
  3. 而是在存储过程内部给out类型参数赋值,在执行完毕后,我们直接拿到输出类型参数的值。

你可能感兴趣的:(Oracle,oracle,数据库,database,dba)