存储过程、函数、游标 .

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值