`
百合不是茶
  • 浏览: 344198 次
社区版块
存档分类
最新评论
阅读更多

游标是oracle中的一个结果集,用于存放查询的结果;

 

PL/SQL中游标的声明;

1,声明游标

2,打开游标(默认是关闭的);

3,提取数据

4,关闭游标

 

 

注意的要点:游标必须声明在declare中,使用open打开游标,fetch取游标中的数据,close关闭游标

 

隐式游标:主要是对DML数据的操作隐式游标的属性有:隐式游标不能使用select into

%FOUND – SQL 语句影响了一行或多行时为 TRUE
%NOTFOUND – SQL 语句没有影响任何行时为TRUE
%ROWCOUNT – SQL 语句影响的行数
%ISOPEN  - 游标是否打开,始终为FALSE

 

 

显示游标

PL/SQL包含隐含游标和显示游标两种游标类型,其中隐含游标用于处理SELECT INTO和DML语句。而显示游标则专门用于SELECT语句返回的多行数据。

 

-----------------------------隐式游标类型

--隐式游标 使用DML语句时自动创建隐式游标
--DML 添加 删除,修改数据的时候(会涉及到数据的变化)

%found 发现数据,%notfound没有发现数据,%isopen游标是否打开,%rowCount受影响的行数

例子;在更新数据中使用游标测试隐式游标

在操作DML数据的时候默认有一个隐式游标sql

declare--声明pl/sql块
begin
 update emp set sal=3000 where ename='SMITH';--更新语句

 if sql%found then --如果发现语句
   dbms_output.put_line('有'||sql%rowcount||'行受到影响');
else --否则
   dbms_output.put_line('没有数据更新');
end if;

 if sql%isopen then  --如果游标打开,游标默认是关闭的
    dbms_output.put_line('游标被打开');
else --游标没有打开
dbms_output.put_line('游标没有被打开');
end if;

end;
/

 结果;

有1行受到影响
游标没有被打开

 

-----------------------------显示游标

 

显示游标用来存放数据的,这也是游标主要功能

%rowtype和%type相似,%rowtype存放的是全部字段,%type只能匹配一个字段,--使用%rowtype 存放查询语句返回的一条数据,

 

%typehe %rowtype的区别;

声明emp表的全部字段

--%type声明emp表中的全部字段
declare
type emp_type_record is record(
  v_ename    emp.ename%type;
  v_sal    emp.sal%type;
   v_empno emp.empno%type;
 ..........
);
begin
end

 %rowtype声明emp表的全部字段

  declare
v_rowtype emp%rowtype;
  begin
end;

 

使用%rowtype来打印emp表部门10的数据

declare
myrow emp%rowtype;
begin
      select ename,job,sal into myrow.ename,myrow.job,myrow.sal from emp where empno=10;
       dbms_output.put_line('ename:'||myrow.ename);
end;
 
ORA-01403: 未找到任何数据
ORA-06512: 在 line 5

 

-------------------显示静态游标

 

要接受多行数据必须使用游标来接受;

declare
myrow emp%rowtype;
  cursor rowcursor is select * from emp where deptno=&a;--声明游标
begin
 --使用循环来取数据   
   for myrow in rowcursor loop
  dbms_output.put_line(myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
end;
CLARK+++++++++++2450
KING+++++++++++5000
MILLER+++++++++++1300

 

游标带参数的类型

declare
myrow emp%rowtype;
  cursor rowcursor(v_deptno number) is select * from emp where deptno=v_deptno;--声明游标
begin
 --使用循环来取数据   
   for myrow in rowcursor(10) loop
  dbms_output.put_line(myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
end;
CLARK+++++++++++2450
KING+++++++++++5000
MILLER+++++++++++1300

 

fetch来取游标的数据  for循环和fetch来取游标需要特别的注意;

declare
 myrow emp%rowtype;
 cursor rowcorsor is select * from emp where deptno=&a;
begin
    --打开游标
    open rowcorsor;
loop
    fetch rowcorsor into myrow;
   exit when rowcorsor%notfound;
dbms_output.put_line(myrow.ename||'+++++++'||myrow.sal);
   end loop;
end;
/
CLARK+++++++2450
KING+++++++5000
MILLER+++++++1300

 

 

 

--------------------------游标的更新

查询部门20的姓名等字段,更新SMITH的工资

declare
myrow emp%rowtype;
  cursor rowcursor(v_deptno number) is select * from emp where deptno=v_deptno;--声明游标
begin
 --使用循环来取数据   
   for myrow in rowcursor(20) loop
  dbms_output.put_line('更新前:'||myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
 
update emp set sal=3000 where ename='SMITH';

 for myrow in rowcursor(20) loop
dbms_output.put_line('更新后:'||myrow.ename||'+++++++++++'||myrow.sal);
end loop; 
end;
更新前:SMITH+++++++++++1000
更新前:JONES+++++++++++2975
更新前:SCOTT+++++++++++3000
更新前:ADAMS+++++++++++1100
更新前:FORD+++++++++++3000
更新后:SMITH+++++++++++3000
更新后:JONES+++++++++++2975
更新后:SCOTT+++++++++++3000
更新后:ADAMS+++++++++++1100
更新后:FORD+++++++++++3000

 

 

 

----------------------------游标的删除

删除游标中部门20 的SMITH;为了测试,设置一个保存点a  savepoint a; 方便回复 rollback to a;

 

declare
myrow emp%rowtype;
  cursor rowcursor(v_deptno number) is select * from emp where deptno=v_deptno;--声明游标
begin
 --使用循环来取数据   
   for myrow in rowcursor(20) loop
  dbms_output.put_line('更新前:'||myrow.ename||'+++++++++++'||myrow.sal);
  end loop;
 
delete emp where ename='SMITH';

 for myrow in rowcursor(20) loop
dbms_output.put_line('更新后:'||myrow.ename||'+++++++++++'||myrow.sal);
end loop; 
end;
 

更新前:JONES+++++++++++2975
更新前:SCOTT+++++++++++3000
更新前:ADAMS+++++++++++1100
更新前:FORD+++++++++++3000
更新后:JONES+++++++++++2975
更新后:SCOTT+++++++++++3000
更新后:ADAMS+++++++++++1100
更新后:FORD+++++++++++3000

 

 

---------------------------显示动态游标 ref  cursor

declare 
 type emp_type_cursor is ref cursor;
  mycursor emp_type_cursor;
 v_row emp%rowtype;
begin
   open mycursor for select * from emp where deptno=&a;
  loop

  fetch mycursor into v_row;
  exit when mycursor%notfound;
  dbms_output.put_line(v_row.ename);
end loop;
end;
 
SMITH
JONES
SCOTT
ADAMS
FORD

 

 

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    Pl/Sql程序设计

    1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...

    PL/SQL 程序设计

    PL/SQL 程序设计 本章主要重点:  PL/SQL概述  PL/SQL块结构  PL/SQL流程  运算符和表达式  游标  异常处理  数据库存储过程和函数  包  触发器

    oracle PL/SQL测试题目和详细答案

    pl/sql存储过程,函数,游标,以及存储过程中的基础知识,绝对值得你收藏的经典题目,让你的pl/sql得到最大的锻炼。让你的数据库逻辑更加灵活。

    PL/SQL课件

    PL/SQL简介(第1~2章) PL/SQL中的SQL语句(第3章) 控制结构(第4~7章) 异常处理(第8~10章) 游标(第11~12章) 触发器(第13~14章) 复合数据类型(第15~16章) 动态SQL(第17章) 批量SQL(第18章) 子程序和包...

    Oracle_PLSQL语言基础

    PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型  . PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有...

    PL/SQL程序设计

    PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些...

    PL/SQL中用到的几种不同类型的游标写法(转)

    NULL 博文链接:https://sytcun.iteye.com/blog/1408182

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

    读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型...

    PL/SQL Developer8.04官网程序_keygen_汉化

    变量声明与赋值 PL/SQL主要用于数据库编程,所以其所有的数据类型跟Oracle数据库里的字段类型是一一对应的,大体分为数字型、布尔型、字符型和日期型。这里简单介绍两种常用数据类型:number、varchar2。  number ...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,而且可以掌握SQL语句和PL/SQL的各种基础知识和高级特征(记录类型、集合类型...

    PL/SQL编程(电子版)

    内容包括(1)PL/SQL简介(2)PL/SQL语法(3)存储过程(4)触发器(5)游标(6)包(7)函数七部分。如果你是初学者,很快时间就可以掌握PL/SQL了。相信我,没错的!

    pl/sql相关学习文档

    pl/sql中的一些基本概念,讲解了pl/sql语句的编写方法。其中包含了pl/sql的简单语句、循环语句、条件语句等的相关知识,重点介绍了存储过程、函数、游标、触发器等的编写和运用。

    oracle存储过程、游标、函数、PL/SQL块

    包含oracle存储过程的增、删、查、改 %type、%rowtype的使用 自定义函数 PL/SQL块

    pl/sql笔记/sql笔记(游标创建存储过程)

    Pl/SQL简介 控制结构 复合数据类型 游标 异常 创建存储过程 函数的概念 包的概念 触发器概念

    Oracle PL/SQL语言初级教程

    2.PL/SQL的复合数据类型 17 使用记录 19 PL/SQL集合 23 嵌套表 24 使用集合 25 集合的方法 28 关于集合之间的比较 29 3.PL/SQL单行函数和组函数详解 29 单行字符串函数 30 单行转换函数 37 SQL中的组函数 40 嵌套...

    oracle实验五 PL/SQL编程

    【实验目的】 1. 熟悉PL/SQL的数据类型和书写规则 2. 熟悉控制结构和游标的使用 3. 编写和运行函数、过程和触发器

    Oracle PL SQL

    走进Oracle、认识PL/SQL、数据表的基本操作、表中数据的基本操作、数据的基本查询、查询中函数的使用、数据表的高级查询、索引及视图的使用、数据类型、流程控制、游标、存储过程和函数、触发器、异常处理、事务和锁...

    PL/SQL语言的简介

    PL/SQL语言的简介 程序结构 流程控制 异常处理 过程与函数 游标 程序包 触发器

    PLSQL基础word

    PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型  . PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,...

Global site tag (gtag.js) - Google Analytics