游标
Oracle会创建一个存储区域,被称为上下文区域
,用于处理SQL语句
,其中包含需要处理的语句,例如所有的信息,行数处理,等等。
游标
是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)由SQL语句返回。行集合光标保持的被称为活动集合。
可以命名一个光标,它可以在程序中获取和处理SQL语句,一次返回的行引用
。
游标属性
游标名%found:当最近一次数据读取成功返回true
游标名%notfound:游标最近一次数据读取失败返回true
游标名%isopen:判断游标是否打开
游标名%rowcount:返回已经读取数据行数
有两种类型的游标:
隐式游标
显式游标
DECLARE
c_id customers.id%type;
c_name customers.name%type;
c_addr customers.address%type;
--一般游标的声明放在变量声明后面
CURSOR c_customers is
SELECT id, name, address FROM customers;
BEGIN
if not c_customers%isopen then
OPEN c_customers; //打开游标
end if;
LOOP
FETCH c_customers into c_id, c_name, c_addr; //执行游标
EXIT WHEN c_customers%notfound;
dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
END LOOP;
dbms_output.put_line(c_customers%rowcount); //输出读取的总行数
CLOSE c_customers; //关闭游标
END;
参数化游标:
注意:传递的参数不能定义长度
例子1
declare
emp1 emp%rowtype;
cursor emp_cur(p_deptno number) is
select *from emp where deptno=p_deptno;
begin
open emp_cur(30); --打开游标
fetch emp_cur into emp1; --执行游标
while emp_cur%found loop
dbms_output.put_line(emp1.empno||emp1.ename);
fetch emp_cur into emp1;
end loop;
close emp_cur;
end;
例子2
--1.输出某个部门的员工姓名,工资,入职日期
declare
type emp_record is record(
v_ename emp.ename%type,
v_sal emp.sal%type,
v_date emp.hiredate%type
);
emp1 emp_record;
cursor emp_cur(p_deptno number) is
select ename,sal,hiredate from emp where deptno=p_deptno;
begin
open emp_cur(30); --打开游标
fetch emp_cur into emp1; --执行游标
while emp_cur%found loop
dbms_output.put_line(emp1.v_ename||emp1.v_sal||emp1.v_date);
fetch emp_cur into emp1;
end loop;
close emp_cur;
end;
游标for循环
--游标for循环
begin
for e in (select empno,ename,sal from emp)loop
dbms_output.put_line(e.empno||e.ename||e.sal);
end loop;
end;
--游标带参for循环
declare
cursor emp_cur(p_deptno emp.deptno%type) is
select *from emp where deptno=p_deptno;
begin
for e in emp_cur(30) loop
dbms_output.put_line(e.empno||e.ename||e.sal);
end loop;
end;
隐式游标
固定游标名称 :sql
游标4大属性
sql%found:如果操作有影响行数,则返回true
sql%notfound:如果操作没有影响行数,返回true
sql%isopen: 恒为 false
sql%rowcount:操作影响的行数
需要在事务结束前,读取的是最近的一次。
网友评论