存储过程与函数

一、存储过程

1)存储过程是一种PL/SQL块,以命名的数据库对象形式存储于数据库当中。

2)可以传递参数给存储过程。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;

 

例题:输入员工号,输出员工姓名

declare

v_empno emp.empno%type:='&请输入员工号:';

v_ename emp.ename%type;

begin 

  select ename into v_ename from emp where empno=v_empno;

  dbms_output.put_line(v_ename);

  exception

    when no_data_found

      then dbms_output.put_line('没有该员工!');

      when others then

        dbms_output.put_line('鹿小葵');

  end;

 

 

过程参数的三种模式:

in 用于接受调用程序的值  默认的参数模式

out用于调用程序返回值

in out 用于接受调用程序的值,并向调用程序返回更新的值

 

1、in 类型的参数

create or replace procedure p_a(v_empno in number) is

v_ename emp.ename%type;

begin

   select ename into v_ename from emp where empno=v_empno;

  dbms_output.put_line(v_ename);

  exception

    when no_data_found

      then dbms_output.put_line('没有该员工!');

      when others then

        dbms_output.put_line('鹿小葵');

end;

 

--调用存储过程---不带参数的存储过程

call p_a(7369);

--存储过程最大的用处就是抽取数据

 

 

2、out 类型的参数

create or replace procedure p_b(v_empno in number,v_ename out varchar2) is

begin

  select ename into v_ename from emp where empno=v_empno;

  exception

    when no_data_found

      then dbms_output.put_line('没有该员工');

      when others then

        dbms_output.put_line('777777');

  end;

 

--调用

declare

v_a emp.ename%type;

begin

  p_b(7788,v_a);

 dbms_output.put_line('员工姓名为'||v_a);

end;

 

 

 

3、in out 类型参数

 

例题:输入两个数返回两个数的和和两个数的差。

create or replace procedure p_c(a in out number,b in out number)is

begin 

  a:=a+b;--返回两数的和

  b:=a-2*b;--返回两数的差

  end;

 

--调用

declare

a number:='&a';

b number:='&b';

begin

  p_c(a,b);

  dbms_output.put_line('和:'||a||' ,差:'||b);

  end;

 

--注意

1)没有参数的时候不需要加括号。也就是第1条语句不能这样写:

create or replace procedure myproc()

2如果有insert,update,delete语句,则一定要有commt语句

 

 

例题:用存储过程 编写一个计算器

1create or replace procedure p_jsq(a number,b varchar2,c number) is

begin

  if b='+' then

   dbms_output.put_line(a+c);

  elsif b='-' then

   dbms_output.put_line(a-c);

  elsif b='*' then

   dbms_output.put_line(a*c);

  elsif b='/' then

   dbms_output.put_line(a/c);

  else

   dbms_output.put_line('运算符不正确');

 end if;

  end;

 

call p_jsq(2,'+',3);

 

2declare

num varchar2(100):='&1';

num1 number(10,2);

begin

  if instr(num,'+')!=0 

    then num1 := substr(num,0,instr(num,'+')-1) + substr(num,instr(num,'+')+1);

  elsif instr(num,'-')!=0

    then num1 := substr(num,0,instr(num,'-')-1) - substr(num,instr(num,'-')+1);

  elsif instr(num,'*')!=0

    then num1 := substr(num,0,instr(num,'*')-1) * substr(num,instr(num,'*')+1);

  else

    num1 := substr(num,0,instr(num,'/')-1) / substr(num,instr(num,'/')+1); 

  end if;

  dbms_output.put_line(num1);

exception

  when others then

  dbms_output.put_line('运算错误');

end;

 

二、函数

1函数是可以返回值的命名的 PL/SQL 子程序。

2函数的返回值类型也必须是数据库类型。

 

1、创建无参函数

 

1)例题:

create or replace function f_a

return varchar2 

is

begin

return'你们最棒';

  end;

  

调用

select f_a() from dual;

declare 

v_a varchar2(20);

begin

  v_a:=f_a();

  dbms_output.put_line(v_a);

  end;

  

2)例题:定义函数MAX_EMP_SAL,没有参数,该函数返回所有员工薪水的最大值。

create or replace function MAX_EMP_SAL

return number 

is

    maxvalue number;

begin

    select max(sal) into maxvalue from emp;

    return maxvalue;

end;

 

调用  select max_emp_sal from dual

 

 

2、创建带参函数

 

1)例题:定义一个函数是一个数的两倍

 create or replace function f_b(v_a number)

 return number

 is

 v_b number;

 begin

   v_b:=2*v_a;

   return v_b;

   end; 

 

 调用 select f_b(5) from dual; 

  

 declare 

 v_a number;

 begin 

   v_a:=f_b(10);

   dbms_output.put_line(v_a);

   end;  

 

 

2)例题:输入员工编号,返回该员工的工资等级 f_c

方法一:

create or replace function f_d(v_x number)

return number

is v_y number;

begin 

select grade into v_y from emp a,salgrade b where a.sal between b.losal and b.hisal and a.empno=v_x; 

return v_y;

end;

 

方法二:

create or replace function f_c(v_a number)

return number

is v_b number;

begin

select grade into v_b from salgrade where (select sal from emp where empno=v_a) between losal and hisal;

return v_b;

end;

 

调用

select f_c(7788) from dual

select f_d(7788) from dual

declare

v_a number;

begin v_a:=f_d(7788);

  dbms_output.put_line(v_a);

   end;  

 

例题:定义函数MATH_SUM,带两个数值参数,该函数返回两个参数的和。定义好函数后,请用此函数计算员工薪水和员工编号的和。

create or replace function math_sum(value1 number, value2 number) 

return number

is

    newvalue number;

begin

    newvalue := value1+value2;

    return newvalue;

end;

 

调用:select empno,sal, math_sum(empno, sal) from  emp

 

三、存储过程与函数的区别

关键字不同 procedure function

规格说明部分 函数有且只有一个return  存储过程没有return

执行部分 函数中必须有return ,return类型必须与规格说明中的类型一致,

存储过程当中也可以有return 但意义完全不同

调用 函数用select语句、pl/sql语句调用,存储过程用call 或pl/sql 调用

5 过程不返回任何值,函数必须返回单个值

posted @ 2019-07-21 18:57  鹿小葵sr  阅读(689)  评论(0)    收藏  举报