oracle之存储过程和存储函数的使用和区别

#存储过程:封装在服务器上一段sql片段,已经编译好了的代码。

1.客户端调存储过程,执行效率就会非常高效。

语法:

create [or replace] procedure 存储过程名称

           (参数名  in|out 参数类型,参数名  in|out 参数类型)is  |  as

- - 声明部分

begin

- - 业务逻辑

end

例子: 

/*需求:给指定员工涨薪,并打印涨薪前后的工资

    参数:in员工编号(用来接受输入) in 涨多少

    声明一个变量:存储涨工资前的工资(因为不确定,所以用变量)  打印涨薪前的工资  更新工资

打印涨薪后的工资

*/

create or replace procedure pro_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;

调用:

方法一:

- -在右边的小窗口中找到一个procedures,并在其中点相应文件点右键,单击view看错误提示。再选中再执行。

      

call proc_updatesal(7788,10);

- -再选中再执行。并在out中可以看到内容。

 

方法二:

begin

      call proc_updatesal(7788,-100);

end;

 

说明:7788是员工编号。

 

----------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------

#存储函数:封装在oracle在服务器里面的plsql片段,

               它是已经编译好的代码片段。

语法:

create [for replace] function 存储函数的名称(参数名 in|out 参数类型,参数名 in|out 参数类型)

return 参数类型

is | as

begin

 

end;

/*存储过程和函数的区别:

1.它们本质上没有区别

2.函数存在的意义是给过程调用 /*存储过程中调用存储函数*/

3.函数的返回类型在is | as上面定义

4.函数可以在sql里面直接调用

*/

例子:默认用in

/*查询指定员工的年薪

参数:员工的编号

返回:年薪

*/

create or replace function

 func_getsal(vempno number)

 return number

is

 - -声明变量,保存年薪

      vtotalsal number;

begin

          select sal*2+nul(comm,0) into vtotalsal

          from emp

          where empno=vempno; 

          return vtotalsal;

end; 

 

说明:into vtotalsal是表示赋值给 into vtotalsal,也就是年薪,并最后将年薪返回过来。

         再然后选中并运行,然后可以看到左侧function中有对应的函数名,可以用view

         查看是否有错误。

 

- -调用存储函数

declare

     vsal number;

begin

     vsal=func_getsal(7788); 

     dbms_output.put_line(); 

- -这里要有一个返回值

- -所以要声明一个返回值

end;

 

- -最后可以在output中看到结果。

 

- -函数可以在sql里面直接调用

select ename,func_getsal(empno)

from emp;

 

—存储过程

create or replace procedure proc_gettotalsal

(empmno in number,vtotalsal out number)

is

begin

      select sal*12+nvl(comm,0) into vtotalsal

      from emp

      where empno=vempno;

end;

 

declare

begin

       pro_gettotalsal(7788,vtotal);

       dbms_output.put_line(“年薪:”|| vtotal);

end;

 

 

----------------------------------------------------------------------------------------

 

说明:重复出变化,把同一东西做三次,好过把十个东西做一次。

 

 

----------------------------------------------------------------------------------------

#OracleNVL函数用法

 

从两个表达式返回一个非 null 值。

语法

     

  NVL(eExpression1, eExpression2)



参数
      

 eExpression1, eExpression2



如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1

eExpression1 eExpression2 可以是任意一种数据类型。如果 eExpression1 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.

 

----------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

成年人的世界没有那么多的童话,也没有那么多的逆袭。
原文地址:https://www.cnblogs.com/shijinglu2018/p/9895196.html