zoukankan      html  css  js  c++  java
  • oracle储存过程--存储过程

    *存储过程*

    *概念:*

    之前我们编写的plsql程序可以进行表的操作,判断、循环逻辑处理的工作,但无法重复调用。

    可以理解之前的代码全部编写在了main方法中,是匿名程序,java可以通过封装对象和方法来解决复用问题。

    Plsql是将一个个plsql的业务员处理过程存储起来进行复用,这些被存储起来的plsql程序称之为存储过程。

    *存储过程作用:*

    1. 在开发程序中,为了一个特定的业务功能,会向数据库进行多次连接关闭(连接关闭是很消费数据库资源的),需要对数据库进行多次i/o读写,性能比较低,如果把这些业务放到plsql中,在应用程序中只需要调用plsql就可以做到连接关闭一次数据库就可以实现我们的业务,可以大大提高效率。

    2. Oracle官方给的建议:能够让数据库操作的不要放在程序中。在数据库中实现基本上不会出现错误,在程序中操作可能会存在错误,(如果在数据库中操作数据,可以有一定的日志恢复等功能)

    *语法*

    Create or replace procedure 过程名称[(参数列表)] is
    Begin
    
    End [过程名称]
    

    根据参数的类型,我们将其分为3类讲解:

    不带参数的

    带有输入参数的

    带输入输出参数(返回值)的

    *不带参数的存储过程:*


    *小案例(热身)**打印输出:hello world*

    create or replace procedure p_hello is
    begin
       dbms_output.put_line('hello world');
    end p_hello;
    
    

    调用存储过程:

    begin
     p_hello;
    end;
    

    我们刚才创建的存储过程:

    注意:***

    第一个问题:is 和 as是可以互相使用的,用哪个关键字是没有关系的

    第二个问题:过程中没有declare关键字,declare用在语句块中

    *带有输入参数的存储过程*

    【示例】查询并打印某个员工(如7839号员工)的姓名和薪水-存储过程:要求,调用的时候传入员工编号,自动控制台打印。

    create or replace procedure p_querynameandsal(i_empno in emp.empno%type) as
    --声明变量
    v_name  emp.ename%type;
    v_sal emp.sal%type;
    begin
      --查询emp表中某个员工的姓名和薪水并赋值给变量
      select ename,sal into v_name,v_sal from emp where empno=i_empno;
       dbms_output.put_line(v_name||'-'||v_sal);
    end;
    --end 后面的存储过程名字必须和前面声明的名字保持一致,要不就不要写
    

    执行:

    begin
     p_querynameandsal(7839);
    end;
    

    执行结果:KING-5000

    *带输入输出参数的存储过程*

    小案例;查询7839号员工的薪水,并将薪水结果返回并且输出。

    create or replace procedure p_querysal_out(i_empno in emp.empno%type,o_sal out emp.sal%type) as
    
    begin
      --查询emp表中某个员工的薪水并将查询返回
      select sal into o_sal from emp where empno=i_empno;
    
    end;
    --end 后面的存储过程名字必须和前面声明的名字保持一致,要不就不要写
    

    执行该存储过程

    declare
      --声明变量接收存储过程中的输出参数
      v_sal emp.sal%type;
      
    begin
     p_querysal_out(7839,v_sal);
     dbms_output.put_line('薪水:'||v_sal);
    end;
    
    

    *执行结果:

    薪水:5000

  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/14259059.html
Copyright © 2011-2022 走看看