PLSQL游标笔记一

原理:plsql块执行查询和数据操纵dml时,oracle会为其分配上下文区(Contextarea),而游标是指向上下文区的指针,所以操纵游标,就是在操纵指针,应该快不少哈。

目标:

1)使用显示游标及游标属性

2)使用参数游标

3)使用显示游标更新或删除数据

4)使用游标for循环

5)使用游标变量

6)使用fetch * bulk collect into 语句和cursor表达式处理多行多列

个人理解一定要灵活使用,游标与复合表,是操作单条多列还是多列多行,单列多行,然后在去选择对应的表或者游标,开始不熟的时候使用一定要先想,用这个处理行不行,这样能帮助你回忆以前记忆的游标的知识,一一排除及找到肯定的以后,这样熟了以后就快了

个人理解隐含式游标只有那种处理select into和dml的语句是,即单行的数据 这里还是有疑问

显示游标呢处理多行单列或者多列的数据。

【显示游标】

使用显示游标记住几步:定义 、打开、遍历、关闭

declare cursor cursor_name is select_statement;

open cursor_name;

fetch cursor_name into variable1,variable2...

fetch cursor_name bulk collect into collect1,collect2...

close cursor_name;

【游标属性】

显示游标属性用于返回显示游标的执行信息,包括%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT,一定要注意与PLSQL异常区分开如NOT_DATA_FOUND ,TOO_MANY_ROWS等

eg:fetch * into 一次只能处理一条语句,为了处理多条需要使用循环

open emp_cursor;

loop

fetch emp_cursor into v_ename,v_sal ;

exit when emp_cursor%NOTFOUND;

dbms_output.put_line(v_ename||v_sal);

end loop;

close emp_cursor;

end;

fetch * bulk collect into提取全部数据

open emp_cursor;

fetch emp_cursor bulk collect into ename_table;

for i in 1..ename_table.count loop

dbms_output.put_line(ename_table(i));

end loop;

end;个人理解这种方式只在处理当列多行方面比较在行

还有一个方法是 fetch * bulk collect into limit rows限制行,就是可以输入多少行。

用游标定义记录变量

cursor emp_cursor is select ename,sal from emp;

emp_record emp_cursor%ROWTYPE:

fetch emp_cursor into emp_record;

dbms_output.put_line(emp_record.sal);

【参数游标】

参数游标顾名思义肯定是游标里边需要一个输入参数,这个参数只能指定数据类型,没有长度,在游标子查询的where字句中引用该参数,否则失去了游标的意义。

declare

cursor emp_cursor(no number) is

select ename,sal from emp where deptno=no;

就是每次输入不同的no值就会得到不同的结果,

【游标更新删除数据此项比较复杂,容易引起问题,后续补充不建议使用】

【游标的for循环】

游标的for循环会隐式的打开游标,提取数据并关闭游标,每循环提取一次数据

for record_name in cursor_name loop

statement1;

statement2;

..

end loop;

declare

CURSOR emp_cursor is select ename,sal from emp;

begin

for emp_record in emp_cursor loop

dbms_output.put_line(emp_cursor%ROWCOUNT||emp_record.ename);

end loop;

end;

简写的

for emp_record in (select ename,sal from emp) loop

dbms_output.put_line(emp_record.ename);

end loop;

显示游标与游标变量的区别,显示游标定义的时候指明select 而游标变量定义是不需要select,可以在打开的时候指定select 也就是open emp_cursor for select_statement;

【游标变量】

为了使用游标变量,必须使用参照类型ref cursor

type ref_type_name is ref cursor [return return_type]

cursor_variable ref_type_name;

cursor_variable就是游标变量名

打开游标

open cursor_variable for select_statement;

提取数据

fetch cursor_variable into variable1,variable2..;

fetch cursor_variable bulk collect into collect1,collect2..

关闭游标

close cursor_variable

eg:定义参照类型的游标变量

declare

type emp_cursor_type ref cursor;

emp_cursor emp_cursor_type;

emp_record emp_cursor%ROWTYPE;

begin

open emp_cursor for select * from emp;

loop

fetch emp_cursor into emp_record;

exit when emp_cursor%NOTFOUND ;

dbms_output.put_line(emp_record.ename);

end loop;

end ;

eg:定义参照类型的时候如果指定了return字句,那么返回的必须与定义的类型匹配,

declare

type emp_record_type is record(

name varchar2(10),salary number(6,2)

);

type emp_cursor_type is ref cursor return emp_cursor_type; 带返回的参照变量

emp_cursor emp_cursor_type;

emp_record emp_record_type;

begin

open emp_cursor for select ename,sal from emp where deptno=20;

loop

fetch emp_cursor into emp_record;

exit when emp_cursor%NOTFOUND;

dbms_output.put_lin(emp_cursor%ROWTYPE||emp_record.name);

end loop;

end;

时间: 2024-10-27 04:23:21

PLSQL游标笔记一的相关文章

PLSQL开发笔记和小结

PLSQL开发笔记和小结 ***************************************** PLSQL基本结构 ***************************************** 基本数据类型变量 1. 基本数据类型 Number 数字型 Int 整数型 Pls_integer 整数型,产生溢出时出现错误 Binary_integer 整数型,表示带符号的整数 Char 定长字符型,最大255个字符 Varchar2 变长字符型,最大2000个字符 Long 变

PLSQL开发笔记和小结(转载)

*****************************************   PLSQL基本结构 ***************************************** 基本数据类型变量      1. 基本数据类型      Number 数字型       Int 整数型       Pls_integer 整数型,产生溢出时出现错误       Binary_integer 整数型,表示带符号的整数       Char 定长字符型,最大255个字符       Va

plsql游标的介绍

3. 游标的介绍    游标:一个指向保存多行SQL查询结果集的工作区的句柄(指针) 3.1 显式游标 (1)显式游标的使用 案例1:定义变量的方式使用游标 declare  cursor csr_org is select h.hrc_descr,o.org_short_name                      from org_tab o,hrc_tab h                     where o.hrc_code=h.hrc_code               

『ORACLE』 PLSQL游标的使用(11g)

游标分类 隐式游标: 对于select..into...语句,一次只能从数据库中获取到一条数据,对于这种类型的DML SQL语句,就是隐式cursor select update/insert/delete操作 显示游标: 由程序员定义和管理,对于从数据库中提取多行数据,就需要使用显式cursor 1.定义游标---cursor  [cursor name]  is 2.打开游标---open    [cursor name] 3.操作数据---fetch    [cursor name] 4.

PLSQL集合笔记

针对多行单列的数据处理,用之前的标量变量肯定不行,这里引入一个新的数据类型复合数据类型. 这个复合类型类似于语言的数组struct[i],包括索引表,嵌套表,边长数组三种类型, 一.索引表称为PLSQL的表,下标与数组比较可以为负数,下标个数没有限制,这个只能用在数据类型,不能定义完之后用在表中承当列类型,不需要初始化. TYPE type_name IS TABLE OF element_type [not null] index by key_type; identifier type_na

oracle 游标笔记

declare v_x number; v_y number; v_geo clob; cursor cur is select c_x, c_y from t_map_data where c_type = 'STREET' and c_object_id = '6FABC5EF8F9D4050950A775CDC86DC47' order by c_id; begin v_geo := 'POLYGON(('; open cur; --打开游标 fetch cur into v_x, v_y

plsql游标最后一行重复的问题

大家仔细看一下,下面第一个存储过程,test01,有没问题? 看似没问题,其实会造成重复行,test02将exit when的语句放到合适的位置上来.就不会出现最后一行重复打印的问题. create or replace procedure test01 as cursor cursor1 is select * from v$session where rownum <= 5; record1 cursor1%rowtype; begin DBMS_OUTPUT.ENABLE(buffer_s

oracle--存储过程,游标,函数,触发器

1. 培训要求 1)掌握PLSQL程序设计 2)掌握存储过程,函数和触发器 3)了解一些oralceSQL语句优化方案 -------------------------------------------------------------------------------------准备篇 col empno for 9999; col ename for a10; col job for a10; col mgr for 9999; col hiredate for a12; col s

Oracle系列:(28)PLSQL

准备篇 col empno for 9999; col ename for a10; col job for a10; col mgr for 9999; col hiredate for a12; col sal for 9999; col comm for 9999; col deptno for 99; col tname for a40; set pagesize 80; 1.SQL对比PLSQL SQL99是什么 (1)是操作所有关系型数据库的规则 (2)是第四代语言 (3)是一种结构