存储过程(Stored Procedure)
在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
语法:
create [or replace] procedure name(parameter in type, parameter out type)
is/as
[变量名] type
begin
存储过程体
end;
/
1) in 代表输入,out 代表输出2) 存储过程中,is 和 as都一样
3) 声明变量时,若为number,不用指定大小,若为varchar2,则需要指定
在存储过程中使用游标:
游标
系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
在存储过程中声明游标:
cursor cursor_name is select column_name from table_name where condition;
循环使用:
open cursor_name;
loop
fetch cursor_name into variable1, variable2;
exit when cursor_name%notfound;
(operation on variables)
end loop;
close cursor_name;
示例:
create or replace procedure l_procedure
is
leave_num number;
student_num varchar2(16);
cursor c_studentnum is select distinct studentnum from leave_apply;
begin
open c_studentnum;
loop
fetch c_studentnum into student_num;
exit when c_studentnum%notfound;
select count(l.applyNum) into leave_Num
from leave_apply l
where l.studentnum = student_Num;
insert into leave_apply_stat(studentnum,leavenum) values(student_Num, leave_Num);
end loop;
close c_studentnum;
commit;
end;
--------------------------------------------------------------------------------------------------
触发器(trigger)
SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
create or replace trigger [trigger name]
before/after insert/update/delete on [table name]
for each row(行级触发器)
when(判断条件)
declare
[variable name] type;
begin
end;
/
1)before/ after 指代触发器是需要在操作完成前/后触发2)insert/update/delete 指代触发触发器的条件
3)for each row 代表这是一个行触发器,对每一行的操作都会触发该触发器。
(加 for each row 和不加的区别在于:加了之后,若update一次更新多行,则每一行的更改都会触发一次触发器;若不加,则无论修改多少行,对表的操作只有一次,只触发一次触发器)
4)对基表的操作引发的触发器无法在基表发生更改后访问该表。
序列的用法:
create sequence [sequence name] start with 1 increment by 1 maxvalue 100 minvalue 1 no circle cache 20;
1)start with代表序列起始值
2)increment代表序列自增值
3)maxvalue最大值, minvalue 最小值, no circle 是否允许循环, cache指代允许预先生成的存入内存中的序列值个数
示例:
create sequence messagenum_seq start with 0 increment by 1;
create or replace trigger tri_update
after update of state on leave_apply
for each row
declare
messagenum number;
content varchar2(128);
begin
select messagenum_seq.nextval into messagenum from dual;
content := '你好,' || :new.state;
insert into message(messagenum, content, applynum, studentnum, time) values(messagenum, content, :new.applynum, :new.studentnum, sysdate());
end;
/