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;
----------------------------------------------------------------------------------------
说明:重复出变化,把同一东西做三次,好过把十个东西做一次。
----------------------------------------------------------------------------------------
从两个表达式返回一个非 null 值。
语法
NVL(eExpression1, eExpression2)
参数
eExpression1, eExpression2
如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。
eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。
----------------------------------------------------------------------------------------