一.隐式游标。
1.隐式游标是由系统自动创建的。通常式有执行SQL语句时创建。
如:
begin
update emp set sal='200' where dep='人事部'
if sql%notfound then
dbms_output.put_line('上调失败');
else
dbms_output.put_line('共有'||sql%rowcount||‘条记录被更新’);
end if;
end;
其中update 更新表中记录,sql%notfound 记录DML操作语句是否有返回数据行,sql%rowcount获取更新行数。
在sql中隐式游标共有4个。
%found 当用户使用DML操作数据时,返回TRUE。%isopen 判断游标是否打开。如果式隐式游标使用总是返回false,代表总是打开。 %notfound 当有DML操作时并且MDL操作没有返回数据时,返回TRUE,否则返回FALSE。%rowcount 返回update 或者select into 操作影响的行数。
二.显示游标。
1.
显示游标通常是有用户创建的,用于对查询结果的查询。游标每次读取只能一行,因此需要循环读取。
1.2
声明游标的语法。
DECLARE CURSOR 游标名称 (参数声明)
IS 查询语句。
1.3
打开游标,读取游标,关闭游标。
OPEN 游标名称(参数)-------打开。
FETCH 游标名称 INTO {RECORD变量}。
CLOSE 游标名称。
在这里说一下RECORD,RECORD是Oracle用来存储游标中的数据的。
实列:
DECLARE CURSOR CUR_YB(var_CS in varchar2)----声明游标来自查询的数据源。
IS select sal,name from emp where dep=var_CS;
TYP REC_EMP IS RECORD (var_sal emp.sal%type,var_name emp.name%type)----声明一个记录。
emp_row REC_EMP;
begin
OPEN CUR_YB('人事');-----打开游标并且传入参数。
FETCH CUR_YB INTO emp_row;-------首先使游标读取到查询的第一行数据。并且存储至emp_row。
while CUR_YB%found loop -----循环读取数据。
dbms_output.put_line('人事部:‘emp_row.var_name||'工资:'emp_row.var_sal );
FETCH CUR_YB INTO emp_row;------将游标读取到下一行数据中。并且存储至emp_row。
end loop;
CLOSE CUR_YB ; ---结束游标
end;
三.游标变量
1.声明游标变量的语法。
TYPE 游标变量类型名称 IS REF CURSOR 数据类型。
2.打开游标变量。
OPEN 游标变量 FOR select语句;
3.读取和关闭与静态一样
FETCH 游标名称 INTO {RECORD变量}。
CLOSE 游标名称。
4.实列。
DECLARE TYP REC_EMP IS REF RECORD RETURN emp%rowtype----声明游标类型
emp_row REC_EMP ;---声明游标变量emp_row
empROW emp%rowtype;------声明一个行记录变量类型。
begin
OPEN emp_row FOR select * from emp where dep='人事部';;
FETCH emp_row INTO empROW ;-------首先使游标读取到查询的第一行数据。并且存储至emp_row。
while emp_row %found loop -----循环读取数据。
dbms_output.put_line('人事部:‘empROW .name||'工资:'empROW .sal );
FETCH emp_row INTO empROW ------将游标读取到下一行数据中。并且存储至emp_row。
end loop;
CLOSE emp_row ; ---结束游标
end;
四.用FOR循环遍历游标
1.隐式遍历
FOR 变量名称 IN (select语句) loop
end loop;
1.1 实列
begin
FOR emp_row IN (select * from emp where dep='人事部') loop ---隐式读取数据
dbms_output.put_line('人事部:‘emp_row .name||'工资:'emp_row .sal );
end loop;
end;
2.显示遍历
FOR RECORD类型变量 IN 游标名称 LOOP
END LOOP;
2.1实列
DECLARE CURSOR cur_emp IS select * from emp where dep='人事部';
begin
FOR emp_row IN cur_emp LOOP
dbms_output.put_line('人事部:‘emp_row .name||'工资:'emp_row .sal );
END LOOP;
end;
----------------小尾巴分割----------------------------------------
菜鸟的记录也是进步~如果对你有所帮助,那就点赞一下吧。-----来自没有代码的程序员小萝卜