oracle存储过程入门案例学习

存储过程个人理解:

存储过程是一种编程的思想,它可以给sql语句加上各种规则从而达到自己特殊的需要,提升SQL语句的执行效率和增强数据库的安全性。

--创建表

create table employee(
         empno number(5) ,--员工编号
         ename varchar2(20), --名称
         sal  number(10), --薪水
         job varchar2(10) default 'CLERK',--工种默认CLERK
         deptno number(10) --部门编号

  )

--创建存储过程

create or replace procedure add_employee(
 eno number ,--员工编号
 name varchar2, --名称
 salary  number, --薪水
 job varchar2 default 'CLERK',--工种默认CLERK
 dno number--部门编号
 )
 is
 begin 
   insert into ADD_EMPLOYEE 
   (empno,ename,sal,job,deptno)values(eno,name,salary,job,dno);

  end; 

--传递参数的三种方式

 begin  
      --按位置传递参数
      ADD_EMPLOYEE(1111,'MARY',2000,'MANAGER',10);
      --按名字传递参数
      ADD_EMPLOYEE(dno=>10,name=>'MARY',salary=>2000,eno=>2112,job=>'MANAGER');
      --混合方式传递参数
      ADD_EMPLOYEE(3111,name=>'MARY',salary=>2000,dno=>2112,job=>'MANAGER');
  end;

  --删除存储过程

drop procedure add_employee;

--存储过程的参数模式

--参数传递主要分为三种:IN,OUT和IN OUT,即输入参数、输出参数和输入/输出参数。默认情况下参数类型为IN

  --创建存储过程
  create or replace procedure QueryEmployee
  (
         v_empno in employee.empno%TYPE,
         v_ename out employee.ename%TYPE,
         v_sal in out employee.sal%TYPE
  )
  as
  begin
    select ename,sal into v_ename,v_sal
    from employee
    where empno=v_empno;
  end;
  --调用存储过程
  declare
          v1 employee.ename%TYPE;
          v2 employee.sal%TYPE;
  BEGIN
          v2:=5000;
          QueryEmployee(1111,v1,v2);

   END;

  --小案例理解in和out的区别

create or replace procedure p(
         A pls_integer,--默认情况下为In
         B in pls_integer,
         C out pls_integer,
         D in out number
  )
  is
  begin 

    if c is null then

      dbms_output.put_line('NULL');-- dbms_output.put_line理解为打印信息的方法
     else
        dbms_output.put_line(c);
      end if;
      dbms_output.put_line(d);
      C:=A+10;
      D:=10/B;
     end;
     
     declare
     aa CONSTANT  PLS_INTEGER:=1;
     bb PLS_INTEGER:=2;
     cc PLS_INTEGER:=3;
     dd PLS_INTEGER:=4;
     begin
       p(aa,bb,cc,dd);
       dbms_output.put_line('After invoking procedure p:');
       dbms_output.put_line('aa='||aa);--||号理解为字符连接符结果集为:aa=1(数字)
       dbms_output.put_line('bb='||bb);
       dbms_output.put_line('cc='||cc);
       dbms_output.put_line('dd='||dd);

     end;

--新建测试窗口 执行调用语句

oracle存储过程入门案例学习--执行调用语句得到以下结果

oracle存储过程入门案例学习--首先会发现为什么c会为null,因为我们在前面在设置存储参数模式时将C字段的参数模式设置为了out,大家记住设置为out模式后无论我们赋予c字段什么值,调用存储过程执行时都不会有任何值的传入。只有赋值为in或者iN out