oracle存储过程和存储函数

1、oracle编程语言

declare 

begin

end;

1、变量声明:

declare 

i number(2)  :=  10;  //对数字类型赋值

str varchar2(20) := 'abcde';  //对字符进行赋值;

ena  emp.ename%type ;   //引用emp表中ename字段的数据类型

emprow emp%rowtype; //记录型变量

begin

dbms_output.put_line(i);  //打印变量

select ename  into  ena from emp where empno = 1;  //用查询语句对ena字段赋值

dbms_output.put_line(ena);

select *  into emprow from emp where empno =1;  //对记录型变量赋值

dbms_output.put_line(emprow.ename  ||  emprow.empno); //打印记录型变量中属性的值

end;

2、if 判断

declare 

i  number(3) := & aa;  //& aa,表示给aa输入一个值,赋值给变量i,

begin

  if  i < 18 then 

  dbms_output.put_line('未成年');

  elsif  i < 36  then

  dbms_output.put_line('中年人');

  else

  dbms_output.put_line('老年人');

  end if;

end;

3、循环

循环1:

declare 

i number(2) := 1;

begin

  while  i < 10  loop

    dbms_output.put_line(i);

    i := i+1;

  end loop;

end;

 

declare 

i number(2) := 1;

begin

    loop

   exit  when i > 10;   //exit 推出循环

   dbms_output.put_line(i);

    i := i+1;

  end loop;

end;

循环2

declare 

begin

  for i in 1..10 loop

  dbms_output.put_line(i);

  end loop;

end;

 

oracle 游标(存放多个对象,多行记录)

declare 

 cursor  c1  is select * from emp;  //定义一个游标并赋值

 emprow emp%rowtype; //记录型变量

begin

  open c1; //打开游标

    loop

      fetch c1 into  emprow ;//将游标中的一行记录赋值emprow变量

      exit when c1%notfound;  //当游标中没有数据时推出循环

      dbms_output.put_line(c1.ename || c1.empno);

    end loop;

  close c1;

end;

-------带参数的游标

declare 

 cursor  c1(eno emp.deptno%type) is select  empno  from emp where deptno = eno ;  //定义一个游标并赋值

 en emp.empno%type; //记录型变量

begin

  open c1(10); //打开游标,并对游标传入参数

    loop

      fetch c2 into en;

      update emp set sal = sal + 100 where empno = en;

      commit;

    end loop;

  close c1;

end;

 

-----------存储过程

--存储过程中的参数是in 类型或out 类型,默认不写为in 类型

create or replace p1(eno emp.empno%type )

is 

begin

  update emp set sal =sal + 100 where empno = eno;

end;

----调用存储过程

declare

begin

 p1(10)

end;

 

---------存储过程中 out类型参数

create or replace p2(eno emp.empno%type , yearsal  out  number )

is 

s number(10);

begin

  select  sal*12 + nvl(comm,0)  into  s  from emp where empno=eno;

  yearsal := s;  //将变量赋值给out类型得变量yearsal

end;

 

declare

s number(10);

begin

 p2(10,s );  //将存储过程得返回值赋值给变量s

dbms_output.put_line(s); //打印变量

end;

 

--------存储函数

create or replace  function f1(eno emp.empno%type) return number  //定义函数,函数名为f1;

is 

s number(10);

begin

select  sal*12 + nvl(comm,0)  into  s  from emp where empno=eno;

return s;   //返回变量

end;

-----调用函数

declare

s number(10);

begin

 s := f1(10);  //将函数得返回值赋值给变量s

dbms_output.put_line(s); //打印变量

end;

 

--------存储过程和存储函数得区别

1、关键字不一样

2、存储函数比存储过程多了两个return;

3、存储函数可以用在sql语句中,存储过程不可以

例如:select empno, f1(empno) from emp;

 

--------触发器

制定一个触发规则,在我们做增删改的时候自动触发,无需调用

------触发器语法

create or replace trigger t1 

after  //表示在操作之后

insert  //指定操作类型

on person //指定触发哪张表

declare

begin

dbms_output.put_line('新增了一个员工'); //触发触发器后要执行的操作

end;

insert into person  values(1,'zs');  //执行该insert操作后会自动触发上面创建的触发器

----案例:修改员工信息时,若工资比原来工资低就抛出异常的触发器

create or replace trigger t12

before 

update

on emp//指定触发哪张表

declare

begin

if  :old.sal > :new.sal then  //:old  变量表示修改前记录的值, :new 表示修改后记录的值

raise_application_error('-20001','工资不能比原来低');

end if;

end;

 

posted @ 2020-10-26 20:59  caoyp  阅读(400)  评论(0编辑  收藏  举报