1.存储过程和函数的区别
存储过程的作用就是要实现我们的整体功能,他可以调用函数来实现;而函数作为代码的模块,用于完成一个特定的功能,而我们可以调用函数来实现我们要的整体功能。
如果需要多个返回值就要用存储过程,函数只能返回一个值。函数必须返回值,然而存储过程不必。
存储过程可以直接执行,而函数必须是被调用
2触发器
事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。
语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。
与特定表关联的存储过程。当在该表上执行DML操作时,可以自动触发该存储过程执行相应的操作
触发操作:Update、Insert、Delete
一个触发器只能属于一个表,一个表可有多个触发器
Create Or Replace Trigger <名称>
[Before | After | Delete | Insert | Update [Of <列名表>] [OR
Before | After | Delete | Insert | Update [Of <列名表>] …]
ON <表名>
[For Each Row] --------对于行级触发器
<PL/SQL块>
END;
注意:没有参数。因为触发器是自动执行的,不能向它传参数
3.游标
游标是客户机上开辟的一块内存,用于存放SQL语句返回的中间结果;
游标可以协调PL/SQL与SQL之间的数据处理矛盾(PL/SQL是过程性语言,每次只能处理单个记录;而SQL是描述性语言,每次可以处理多行记录。);
PL/SQL中可以通过游标来过程化存取SQL返回的结果
存储过程举例:
sno Student.s#%TYPE; --声明为正在使用的表中的某个列类型
name student.sname%TYPE;--可以保证代码与数据库结构之间的独立性
stu Student%ROWTYPE; --声明为表的行类型
--返回所有学生记录的学号和姓名
DECLARE
Cursor stu IS select s#,sname from student;
sno student.s#%TYPE;
name student.sname%TYPE;
BEGIN
Open cs_stu;
Loop
Fetch cs_stu Into sno,name;
Exit When cs_stu%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(…);
End Loop;
Close cs_stu;
END;
PL/SQL使用游标属性判断游标的当前状态
Cursor%FOUND ---布尔型,当前FETCH返回一行时为真
Cursor%ISOPEN ----布尔型,若游标已经打开则为真
Cursor%ROWCOUNT ---数值型,显示目前为止已从游标中取出的记录数
函数的概念:具有返回值的存储过程
使用过程和函数的注意点
变量:name varchar2(20) 必须指定长度
参数:name IN varchar2 不能指定长度
函数举例:
Create or Replace Function StudentCount(DeptNo IN varchar2)
Return Number
AS
v_count Number:=0;
BEGIN
select count(s#) Into v_count From Student where dept=deptno;
return v_count;
END;
触发器举例:
Create or Replace Trigger SetStatus2
before update of score On SC
For Each Row ------------------行级触发
Declare
a Number:=0;
Begin
Select count(*) into a From SC where s#=:new.s# and score<60;
If a>=2 and :new.score<60 Then
Update student Set status='NO' Where s#=:new.s#;
End If;
if a=3 and :new.score<60 Then
Update student Set status='NO' Where s#=:new.s#;
End If;
END;
Create or Replace Trigger TotalStudent ---------------语句级触发器
After Insert Or Delete On Student
Declare
a Number:=0;
Begin
Select count(*) into a From Student ;
Update University Set s_count=a;
END;