• 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.

     

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

     

     

     

     

     

     

     

     

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    HTTP 404
    hibernate官方新手教程 (转载)
    OpenStreetMap初探(一)——了解OpenStreetMap
    fopen 參数具体解释
    怎样将程序猿写出来的程序打包成安装包(最简单的)
    poj 2253 Frogger (最长路中的最短路)
    android笔记6——intent的使用
    uva 11133
    天津出差系列(五)----第五天
    贪心2--均分纸牌
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/9895196.html
Copyright © 2020-2023  润新知