sql 游标

Posted yang_z_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 游标相关的知识,希望对你有一定的参考价值。

sql 游标

一 什么是游标?

游标:
oracle在执行sql语句时,会给每个sql语句分配一个缓冲区,
用来临时存储sql语句和sql语句的结果及参数。
游标是指向这个缓冲区的一个指针(地址),
通过操作游标,可以处理sql的执行结果

布尔类型,boolean:它只有三个值,true,false,null,boolean类型不能直接打印,只能作为条件

游标分类

游标分为显式游标和隐式游标:**

游标的属性:
%found:返回一个boolean类型数据,当前游标指向的数据不为空时返回true,否则返回false
%notfound:和%found相反,当游标指向的数据为空时返回true,否则返回false
%isopen:返回一个boolean类型,当前游标如果是打开的返回true,否则返回false
%rowcount:返回一个数字,可以表示游标当前数据的数据行号,还可以表示游标指向的结果集数据条数。
游标属性的使用:
游标变量名%属性名

1.显式游标

自己定义使用的游标。

游标定义:
cursor 游标变量名 is select语句;

游标的使用:
1.打开游标
open 游标变量名;

2.使用fetch into语句让游标指向下一条数据,并把数据保存到一个变量中
fetch 游标变量 into 变量;

3.对当前变量中的数据进行处理(使用循环来遍历游标)

4.关闭游标
close 游标变量

通过游标打印emp表的所有的员工信息

--通过游标打印emp表的所有的员工信息
declare
   --定义一个游标,指向emp表的所有信息
   cursor c_emp is select * from emp;
   --声名一个变量,用来保存游标中的一条记录
   v_emp emp%rowtype;
begin
   --打开游标
   open c_emp;
   --loop循环遍历游标的结果集
   loop
      --执行fetch into 将游标指向下条数据
      fetch c_emp into v_emp;
      --判断游标是否为空,如果为空退出循环
      exit when c_emp%notfound;
      --处理当前v_emp变量中的数据
      dbms_output.put_line(c_emp%rowcount||','||v_emp.empno||','||v_emp.ename||','||v_emp.job||','||v_emp.sal); 
   end loop;
   dbms_output.put_line(c_emp%rowcount);
   --关闭游标
   close c_emp;
end;

while循环遍历游标

--while循环遍历游标
declare
   --定义一个游标,指向所有的员工信息
   cursor c_emp is select * from emp;
   --定义一个变量,用来保存游标的一条记录
   v_emp emp%rowtype;
begin
   --打开游标
   open c_emp;
   --将游标指向第一条数据
   fetch c_emp into v_emp;
   --循环遍历游标
   while c_emp%found loop
      --处理当前v_emp变量中的数据,
      dbms_output.put_line(c_emp%rowcount||','||v_emp.empno||','||v_emp.ename||','||v_emp.job||','||v_emp.sal); 
      --让游标指向下一条数据
      fetch c_emp into v_emp;
   end loop;
   --关闭游标
   close c_emp;
end;

遍历游标最简单的一种方式for循环遍历

--遍历游标最简单的一种方式for循环遍历
declare
   --定义一个游标变量,指向所有emp表的数据
   cursor c_emp is select * from emp;
begin
   for v_emp in c_emp loop
      --处理当前v_emp变量中的数据,
      dbms_output.put_line(c_emp%rowcount||','||v_emp.empno||','||v_emp.ename||','||v_emp.job||','||v_emp.sal); 
   end loop;
end;

2.隐式游标

隐式游标:它是在执行delete、update、insert语句时系统给这些语句自动分配一个游标,
游标的名字是sql,sql%found sql%notfound sql%rowcount sql%isopen;
begin
update emp set sal=sal+100;
dbms_output.put_line(sql%rowcount);
end;

3.游标参数

语法:
cursor 游标名(形参名 参数类型[:=默认值],…) is select语句
select语句中可以使用形参名作为查询条件

使用
打开游标
open 游标名(实参);
传参方式3种
1.传值
2.传变量,将变量的值传给游标
3.按位传值 ,形参名=>值
遍历游标和之间一样
关闭游标
close 游标名;

输入一个部门编号,查询出部门下的所有员工信息

--输入一个部门编号,查询出部门下的所有员工信息
declare
  --声名一个游标变量
  cursor cur is select * from emp where deptno=&deptno;
  --声名一个变量用来保存游标中的一条记录
  v_emp emp%rowtype;
  
begin
  --打开游标
  open cur;
  --遍历游标
  loop
    --将游标指向下一条数据
    fetch cur into v_emp;
    --判断游标是否为空
    exit when cur%notfound;
    --打印员工信息
    dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);
  end loop;
  --关闭游标
  close cur;
end;
declare
  --声名一个游标变量
  cursor cur(v_dno number:=10) is select * from emp where deptno=v_dno;
  --声名一个变量用来保存游标中的一条记录
  v_emp emp%rowtype;
  --声名一个变量
  v_deptno emp.deptno%type;
begin
  --从键盘输入一个部门编号,存入v_deptno中
  v_deptno:=&deptno;
  --打开游标
  open cur(v_deptno); --open cur(10);
  --遍历游标
  loop
    --将游标指向下一条数据
    fetch cur into v_emp;
    --判断游标是否为空
    exit when cur%notfound;
    --打印员工信息
    dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);
  end loop;
  --关闭游标
  close cur;
end;
declare
  --声名一个游标变量
  cursor cur(v_dno number:=10) is select * from emp where deptno=v_dno;
  --声名一个变量用来保存游标中的一条记录
  v_emp emp%rowtype;
  --声名一个变量
 -- v_deptno emp.deptno%type;
begin
  --从键盘输入一个部门编号,存入v_deptno中
  --v_deptno:=&deptno;
  --打开游标
  open cur; --open cur(10);
  --遍历游标
  loop
    --将游标指向下一条数据
    fetch cur into v_emp;
    --判断游标是否为空
    exit when cur%notfound;
    --打印员工信息
    dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);
  end loop;
  --关闭游标
  close cur;
end;
declare
  --声名一个游标变量
  cursor cur(v_dno number:=10) is select * from emp where deptno=v_dno;
  --声名一个变量用来保存游标中的一条记录
  v_emp emp%rowtype;
  --声名一个变量
 -- v_deptno emp.deptno%type;
begin
  --从键盘输入一个部门编号,存入v_deptno中
  --v_deptno:=&deptno;
  --打开游标
  open cur(10); --open cur(10);
  --遍历游标
  loop
    --将游标指向下一条数据
    fetch cur into v_emp;
    --判断游标是否为空
    exit when cur%notfound;
    --打印员工信息
    dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);
  end loop;
  --关闭游标
  close cur;
  
  --打开游标
  open cur(20); --open cur(10);
  --遍历游标
  loop
    --将游标指向下一条数据
    fetch cur into v_emp;
    --判断游标是否为空
    exit when cur%notfound;
    --打印员工信息
    dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);
  end loop;
  --关闭游标
  close cur;
end;

4.游标类型的定义

定义游标类型语法:
type 类型名 is ref cursor; --声名一个游标类型

声名游标变量
游标变量名 游标类型名;

–游标变量的使用,只能用loop循环或while循环去变量
打开游标变量:
open 游标变量名 for select语句;
遍历和之间一样
关闭游标变量
close 游标变量

游标类型和游标变量,可以动态地指定游标所指向的结果集合

declare
  --声名一个游标类型
  type cur_type is ref cursor;
  --声名一个游标变量
  cur cur_type;
  --声名一个变量用来保存dept表中的一条记录
  v_dept dept%rowtype;
  --声名一个变量用来保存emp表中的一条记录
  v_emp emp%rowtype;
begin
  --查询所有的部门信息
  open cur for select * from dept;
  --遍历游标
  loop
    --将游标指向下一条数据
    fetch cur into v_dept;
    --判断退出条件
    exit when cur%notfound;
    --打印部门信息
    dbms_output.put_line(v_dept.deptno||','||v_dept.dname);
  end loop;
  --关闭游标
  close cur;
  if cur%isopen then
     dbms_output.put_line('游标已打开');
  end if;
  --查询所有的员工信息
  --打开游标
  open cur for select * from emp;
  --遍历游标
  loop
    --游标指向下一条记录
    fetch cur into v_emp;
    --判断退出条件
    exit when cur%notfound;
    --打印员工信息
    dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);
  end loop;
  --关闭游标
  close cur;
end;

以上是关于sql 游标的主要内容,如果未能解决你的问题,请参考以下文章

SQL记录-PLSQL包

如何优化使用游标的 PL/SQL 代码

游标的 PL/SQL 代码中的错误

过程中的PL/SQL游标问题

游标和递归sql 的一些代码

游标和递归sql 的一些代码