oracle11g游标及触发器相关知识
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oracle11g 游标:
1. 当在PL/SQL中使用SQL语句时,Oracle会为其分配上下文区域,这是一段
私有的内存区域,用于暂时保存SQL语句影响到的数据。游标是指向这段内存区域的指针。
2. Oracle中主要有两种类型的游标:
(1) 隐式游标:所有的DML语句和PL/SQL SELECT 语句都有;
(2) 显式游标:由开发人员声明和控制。
3. 可以使用的游标属性包括四种:%ROWCOUNT、%FOUND、%NOTFOUND、
%ISOPEN,这四种属性对于显式游标和隐式游标都有用,但是含义和使用方法略有不同。游标在使用属性时,需要以游标名称作为前缀,以表明该属性是哪个游标的,隐式游标没有名称,所以在使用隐式游标时采取了统一的一个名称SQL。
4. 在PL/SQL中的SELECT语句只能且必须取出一行数据,取出多行或者零行都
被认为是异常,所以在对多行数据进行操作时,必须使用显式游标来实现。
5. 使用显式游标的步骤:
(1)声明游标:CURSOR cursor_name is select_statement;
(2)打开游标:OPEN cursor_name;
(3)取游标中的数据:FETCH cursor_name INTO variable1,variable2,...;
(4)关闭游标:CLOSE cursor_name;
6.用变量接收游标中的数据
sql> declare
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
cursor emp_cursor is select ename,sal from emp
where deptno=10;
begin
open emp_cursor;
loop
fetch emp_cursor into v_name,v_sal;
exit when emp_cursor%NOTFOUND;
dbms_output.put_line(v_name || ‘的薪水是’ || v_sal);
end loop;
dbms_output.put_line(‘共取出了’ || emp_cursor%ROWCOUNT || ‘条记录’);
close emp_cursor;
end;
7.通常简单LOOP循环与%NOTFOUND属性配合使用,而WHILE循环与%FOUND属性配合使用。
8.使用记录接收游标中的数据
sql> declare
cursor emp_cursor is select ename, sal from emp
where deptno=10;
--注意创建记录类型的方式
emp_record emp_cursor%ROWTYPE;
begin
open emp_cursor;
loop
fetch emp_cursor into v_name,v_sal;
exit when emp_cursor%NOTFOUND;
dbms_output.put_line(v_name || ‘的薪水是’ || v_sal);
end loop;
dbms_output.put_line(‘共取出了’ || emp_cursor%ROWCOUNT || ‘条记录’);
close emp_cursor;
end;
9.带有参数的游标的语法:
CURSOR cursor_name
[(parameter_name datatype,...)]
IS
select_statement;
10.sql> declare
cursor emp_cursor(v_deptno NUMBER) is
select ename,sal from emp where deptno=v_deptno;
emp_record emp_cursor%ROWTYPE;
begin
open emp_cursor(20);
loop
fetch emp_cursor into emp_record;
exit when emp_cursor%NOTFOUND;
dbms_output.put_line(emp_ || ‘的薪水是’ || emp_cursor.sal);
end loop;
dbms_output.put_line(‘共取出了’ || emp_cursor%ROWCOUNT || ‘条记录’);
close emp_cursor;
end;
11.游标变量:也叫做动态游标,通过REF CURSOR方式定义,它仍然是指向一段SQL语句的内存地址的指针。和动态游标相比,之前在声明时就定义好SELECT语句的游标称作静态游标,而动态游标在打开时才指定其所对应的SELECT语句。12.sql> declare
--定义游标变量类型
type dept_cursor_type is ref cursor
return dept%ROWTYPE
--定义游标变量
dept_cursor dept_cursor_type;
--定义记录类型
dept_record dept%ROWTYPE;
begin
open dept_cursor for select deptno,dname,loc
from dept;
fetch dept_cursor into dept_record;
while dept_cursor%FOUND loop
dbms_output.put_line(dept_record.deptno||’,’||dept_record.dname||’,’||dept_record.loc);
fetch dept_cursor into dept_record;
end loop;
dbms_output.put_line(‘GAME OVER’);
end;
以上定义的游标变量中指定了返回类型,也就是说,游标对应的结果集必须按照返回类型的规定来定义,这种游标称作强类型游标变量,除此之外还有一种弱类型游标变量。
13.游标的FOR循环:
for record_name in cursor_name loop