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

游标是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基础**:手册可能会从基础开始,介绍PL/SQL的基本结构,包括声明变量、常量、游标、记录类型等。还会讲解如何编写存储过程、函数和触发器。 2. **控制流程语句**:这包括条件判断(IF-THEN-ELSIF-ELSE)...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    3. **游标**:PL/SQL支持游标,允许用户逐行处理查询结果,这对于处理大量数据时非常有用。 4. **事务管理**:PL/SQL提供BEGIN、COMMIT、ROLLBACK等语句来管理事务,确保数据的一致性和完整性。 5. **异常处理**:...

    oracle10g_pl/sql

    - **变量和常量**:PL/SQL支持各种数据类型,如NUMBER、VARCHAR2、DATE等,以及声明变量和常量的方式。 - **流程控制**:包括IF...ELSIF...ELSE、CASE、FOR循环、WHILE循环等结构。 2. **PL/SQL程序单元** - **...

    Oracle PL/SQL实战(待续)

    同时,PL/SQL支持多种数据类型,包括数值类型(NUMBER)、字符类型(VARCHAR2, CHAR)、日期类型(DATE)等,以及复合类型如记录(RECORD)和表类型(TABLE)。 此外,PL/SQL的包(PACKAGE)概念是将相关的过程和...

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

    总结起来,PL/SQL中的游标类型主要包括隐式游标、显式游标、匿名块游标、游标变量和FOR-LOOP游标。每种游标类型都有其特定的应用场景,熟练掌握这些游标用法将有助于编写更加高效和灵活的数据库应用程序。

    oracle pl/sql从入门到精通 配套源代码

    此外,PL/SQL还支持集合类型,如VARRAY(可变数组)和TABLE(表类型),这对于处理大量数据非常有用。 这本书的配套源代码可能会涵盖以下几个方面: 1. **基础操作**:包括简单的SQL查询、变量声明、流程控制...

    ORACLE PL/SQL从入门到精通

    PL/SQL提供了隐式游标和显示游标的两种类型,分别用于处理SELECT语句的返回结果。使用游标的FOR循环可以简化对游标的操作。 循环语句是PL/SQL编程中用来重复执行一组语句的结构,包括loop、while、for三种形式,...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    2. **变量和数据类型**:PL/SQL支持多种数据类型,包括数值型(NUMBER、BINARY_INTEGER、PLS_INTEGER)、字符型(VARCHAR2、CHAR)、日期型(DATE)、布尔型(BOOLEAN)以及复合数据类型如记录和数组。 3. **控制...

    PL/SQL 基本知识

    PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...

    PL/SQL编程基础知识

    - **程序包**:集合了一系列相关的子程序、类型定义和其他PL/SQL元素,便于管理和复用。 **2.3 标识符规则** PL/SQL中的标识符遵循以下规则: - 标识符长度不能超过30个字符。 - 第一个字符必须是字母。 - 不区分...

    PL/SQL入门到精通书的源代码

    12. **游标变量**:游标变量是PL/SQL中的一种特殊变量,可以直接存储查询结果,用于在程序中传递查询结果。 13. **PL/SQL与Oracle数据库对象**:学习如何在PL/SQL中创建、修改和删除数据库对象,如表、视图、索引等...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    3. **游标**:在PL/SQL中如何使用游标处理单行或多行数据,以及游标的声明、打开、关闭和循环遍历。 4. **记录类型**:定义和操作记录类型,用于处理动态或不确定的数据结构。 5. **集合类型**:包括数组(PLS_...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    12. **高级PL/SQL特性**:如 bulk collect、pipelined函数、类型继承、嵌套事务等,这些特性能帮助开发者编写更高级的解决方案。 通过学习这些内容,开发者可以掌握Oracle PL/SQL的高级特性,从而设计和实现更高效...

    PL/SQL下载

    1. **基础语法**:理解PL/SQL的基本数据类型、变量声明、流程控制结构等。 2. **函数和过程**:掌握如何定义和调用自定义函数和过程。 3. **游标**:了解如何使用游标处理结果集。 4. **异常处理**:学习如何编写...

    PL/SQL安装包

    7. **记录类型和变量**:PL/SQL支持自定义记录类型和变量,使得可以创建更贴近业务需求的数据结构。 这个"PL/SQL安装包"可能包含了以下组件: - **PL/SQL Developer**:一个强大的Oracle数据库开发工具,支持PL/...

    精通pl/sql

    2. **PL/SQL数据类型**:详细讲解PL/SQL支持的数据类型,如数值型、字符型、日期时间型、布尔型、记录类型、游标类型等,以及如何进行数据转换和操作。 3. **PL/SQL控制结构**:深入探讨流程控制语句,如循环...

    Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本

    1. **基础语法**:PL/SQL的基础包括声明变量、常量、游标、记录类型以及控制流程语句(如IF-THEN-ELSIF,WHILE,FOR循环)。书中会详细介绍如何编写简单的PL/SQL块,包括声明部分、执行部分和异常处理部分。 2. **...

    pl/sql 学习资料

    - 数据类型:熟悉PL/SQL内置的数据类型,如NUMBER、VARCHAR2、DATE等。 - 变量和常量:声明和使用变量,以及定义常量。 - 控制流程语句:学习IF-THEN-ELSIF-ELSE、CASE、FOR循环、WHILE循环等。 - 函数和过程:...

    Oracle PL/SQL学习官方教材

    1. **基础概念**:首先,教材会介绍PL/SQL的基本概念,包括块(Block)、变量(Variable)、常量(Constant)、数据类型(Data Types)和声明(Declaration)。例如,PL/SQL中的块由BEGIN、END语句界定,变量和常量...

Global site tag (gtag.js) - Google Analytics