• pl/sql--存储函数,存储过程


    存储函数,存储过程

      相同点: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;
  • 相关阅读:
    myBatis学习笔记(10)——使用拦截器实现分页查询
    电影院的设计与实现(改进更新)
    软件设计师自我修炼1:怎样让用户对软件产生依赖
    jQuery.ajax()方法中參数具体解析
    王立平--Gallery:实现图片的左右滑动
    USB设备驱动概述
    Android中的多线程编程(一)附源代码
    Shannon-Fano-Elias编码的C语言实现
    互联网协议入门深入
    linux内核中创建线程方法【转】
  • 原文地址:https://www.cnblogs.com/cbpm-wuhq/p/11958879.html
Copyright © 2020-2023  润新知