二十、Oracle学习笔记:编写存储过程

一、编写存储过程
1.复用匿名代码块,我们需要使用存储过程,函数,触发器等,存储过程就是封装了一个匿名代码块,可以通过参数进行输入,输出值。
   我们可以通过调用有名称的存储过程来复用代码块。
2.格式:

create [or replace] procedure 名称[(参数1 类型,参数2 类型 , ...)]
  is|as 
    --变量声明区间
  begin
     --业务逻辑区间
  end;
  /

3.存储过程的调用
   (1)直接调用
     call 存储过程名(有参传参);
   (2)plsql调用
     begin
          存储过程名(有参传参);
     end;

--练习:使用存储过程输出显示helloword
  create or replace procedure pro_d
    is
  begin
    dbms_output.put_line('Helloworld');
  end;
  /
  begin
    pro_d();
  end;
  /
--练习:定义一个存储过程输出参数内容
  create or replace procedure pro_out(idc number)
  is 
    s number(4):=5;
  begin
    s:=s+idc;
    dbms_output.put_line(s);
  end;
  /
  begin    
    pro_out(5);
  end;
  /
--练习,使用存储过程,获取某一员工的编号对应的姓名和职位
  create or replace procedure pro_equ(eno number)
  is
    ena emp.ename%type;
    ejob emp.job%type;
  begin
    select ename,job into ena,ejob from emp where empno=eno;
    dbms_output.put_line(ena||'----'||ejob);
  end;
  /
  begin
    pro_equ(7369);
  end;
  /
--练习,传入一个部门编号,查询部门的总工资
  create or replace procedure pro_ssal(dno number)
  is
     s emp.sal%type; 
  begin
    select sum(sal) into s from emp where deptno=dno;
    dbms_output.put_line(s);
  end;
  /
  begin
    pro_ssal(10);
  end;
  /    


4.存储过程可以使用参数返回数据,特点:此时参数需要一些属性(in |out |in out)。
     in表示参数只能传入 不能输出(默认状态下属性为in)
     out表示参数只能用于输出
     in out 表示参数可以传入传出
     格式 :参数名 [in|out|in out] 类型

--练习 :传入两个参数,计算两个数的和与差
  create or replace procedure pro_sum(a in number,b in number,s out number)
  is
  begin
    s:=a+b;
  end;
  / 
  declare
    total number(8);  
  begin
     pro_sum(4,5,total);
     dbms_output.put_line(total);
  end;
  / 


--练习:创建一个存储过程,完成临时表的信息存入dept表中,
--      然后删除临时表数据
  drop table dept_bak;
  create table dept_bak(
    deptno number(4),
    dname varchar2(20),
    loc varchar2(50)
  );
       
  insert into dept_bak values(11,'a','b');
  insert into dept_bak values(12,'c','d');
  insert into dept_bak values(13,'e','f');
  commit;
  select * from dept_bak;
--编写存储过程
--使用行变量接收临时表的数据,同时完成对表的数据插入
  create or replace procedure pro_copy
  is
    cursor c is select * from dept_bak;
  begin
    for rowbak in c loop
      insert into dept values(rowbak.deptno,rowbak.dname,rowbak.loc);
    end loop;
    delete from dept_bak;
    commit;
  end;
  /
  begin
    pro_copy();
  end;
  /
    

--练习:返回a和b的和与差
  create or replace procedure pro_com(a in number,b in number,s out number,c out number)
  is
  begin
    s:=a+b;
    c:=a-b;
  end;
  /
  set serveroutput on;
  declare
    s1 number(8);
    s2 number(8); 
  begin
    pro_com(8,6,s1,s2);
    dbms_output.put_line(s1);
    dbms_output.put_line(s2);
  end;
  /

猜你喜欢

转载自blog.csdn.net/qq_38741971/article/details/81429346