存储过程和存储函数

1. 存储过程

  1.1 定义

    是一组预编译的sql语句,也就是给pl/sql语句包装起来,完成一次创建任意调用的功能,相当于java中的方法。经编译之后存储在数据库中,用户通过制定存储过程的名字并给出参数(如果该存储过程带有参数的话)来执行它。

  1.2 语法

    create [or replace] procedure 存储过程名(参数名1 in/out 参数类型1,参数名2 in/out 参数类型2

    is/as

      ——声明部分

    begin

      ——业务逻辑部分

    end;

    举个栗子:给指定员工涨薪,并打印涨薪前和涨薪后的工资。

    create or replace procedure proc_updatesal(vempno in number,vnum in number)
    is
      --声明变量.记录当前工资
      vsal number;
    begin
      --查询当前的工资
      select sal into vsal from emp where empno = vempno;
      --输出涨薪前的工资
      dbms_output.put_line('涨薪前:'||vsal);
      --更新工资
      update emp set sal = vsal + vnum where empno = vempno;
      --输出涨薪后的工资
      dbms_output.put_line('涨薪后:'||(vsal+vnum));
      --提交
      commit;
    end;

2. 存储函数

  2.1 定义

    通常存储函数是给存储过程调用的。

  2.2 语法

    create [or replace] function存储函数名(参数名1 in/out 参数类型1,参数名2 in/out 参数类型2) return 返回类型

    is/as

      ——声明部分(声明结果变量)

    begin

      ——业务逻辑部分

     return (结果变量);

    end;

    举个栗子:查询指定员工的年薪。

    create or replace function func_getsal(vempno number) return number
    is
      --声明变量.保存年薪
      vtotalsal number;
    begin
      select sal*12 + nvl(comm,0) into vtotalsal from emp where empno = vempno;
     return vtotalsal;
    end;

3. 存储过程和存储函数的区别

    1.存储函数可以有返回值也可以没有返回值,存储函数不许有返回值

    2.存储过程和存储函数都可以通过输出参数out实现多个返回值

  怎么选择?

    原则上只有一个返回值用存储函数,否则用存储过程

    但是我们一般都是用存储过程,因为

      1.存储过程可以有返回值也可以没有返回值,存储的灵活性

      2.存储过程既然有返回值了,可以替代存储函数

      3.oracle新版中已经不推荐使用存储函数了

java中通过CallableStatement调用存储过程

原文地址:https://www.cnblogs.com/sun7897/p/8592931.html