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;