存储函数,存储过程

  相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数。

          2.都是一次编译,多次执行。

  不同点:1.存储过程定义关键字用procedure,函数定义用function。

      2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。

      3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute 2.使用begin和end),函数除了存储过程的两种方式外,

        还可以当做表达式使用,例如放在select中(select f1() form dual;)。

  总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。

一:存储函数

1.存储函数编写

(1)函数的声明

(2)函数形参声明   in /out

(3)返回值类型 return type;

(3)变量声明         基本变量/record/cursor

(4)返回值   retun result;   

关于 OUT 型的参数: 因为函数只能有一个返回值, PL/SQL 程序可以通过 OUT 型的参数实现有多个返回值

要求: 定义一个函数: 获取给定部门的工资总和 和 该部门的员工总数(定义为 OUT 类型的参数).
要求: 部门号定义为参数, 工资总额定义为返回值.

create or replace function sum_sal(dept_id number, total_count out number)
       return number
       is
       --变量声明(游标)
       cursor sal_cursor is select salary from employees where department_id = dept_id;
       v_sum_sal number(8) := 0;   
begin
       total_count := 0;
    
       for c in sal_cursor loop
           v_sum_sal := v_sum_sal + c.salary;
           total_count := total_count + 1;
       end loop;       

       --dbms_output.put_line('sum salary: ' || v_sum_sal);
       return v_sum_sal;
end;  

2.调用测试   select function(参数)  from dual; //记得接收返回值

delare 
  v_total number(3) := 0;

begin
    dbms_output.put_line(sum_sal(80, v_total));
    dbms_output.put_line(v_total);
end;

二:存储过程

1.存储过程创建 和存储函数基本相同,只是没有return返回值

定义一个存储过程: 获取给定部门的工资总和(通过 out 参数), 要求:部门号和工资总额定义为参数

create or replace procedure sum_sal_procedure(dept_id number, v_sum_sal out number)
       is
       
       cursor sal_cursor is select salary from employees where department_id = dept_id;
begin
       v_sum_sal := 0;
       
       for c in sal_cursor loop
           --dbms_output.put_line(c.salary);
           v_sum_sal := v_sum_sal + c.salary;
       end loop;       

       dbms_output.put_line('sum salary: ' || v_sum_sal);
end;

2.调用测试

declare 
     v_sum_sal number(10) := 0;
begin
     sum_sal_procedure(80,v_sum_sal);
end;

 

 posted on 2019-11-29 16:53  wu小强  阅读(542)  评论(0编辑  收藏  举报