PLSQL_Les03--游标

合集下载

PLSQL游标讲解

PLSQL游标讲解

游标的概念为了处理SQL 语句,ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处理的行的数目,一个指向语句被分析以后的表示形式的指针以及查询的活动集(active set)。

游标是一个指向上下文的句柄( handle)或指针。

通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。

游标的概念对于不同的SQL语句,游标的使用情况不同:显式游标处理显式游标需要四个PL/SQL步骤定义游标:就是定义一个游标名,以及与其相对应的SELECT 语句,其一般形式为:CURSOR cursor_name IS select_statement;其中:游标声明部分是唯一可以出现在模块声明部分的步骤,其他三个步骤都在执行和异常处理部分中 游标名是表识符,所以也有作用域,并且必须在使用前进行说明任何SELECT语句都是合法的,但是SELECT …INTO语句是非法的在声明部分的末尾声明游标打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。

OPEN cursor_name其中:PL/SQL 程序不能用OPEN 语句重复打开一个游标提取游标:就是检索结果集合中的数据行,放入指定的输出变量中。

FETCH cursor_name INTO {variable_list | record_variable };关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。

关闭后的游标可以使用OPEN 语句重新打开。

CLOSE cursor_name;DECLAREv_ename emp.ename%TYPE;v_sal emp.sal%TYPE;CURSOR c_cursor IS SELECT ename, sal FROM emp WHERE rownum<11; BEGINOPEN c_cursor;FETCH c_cursor INTO v_ename, v_sal;WHILE c_cursor %FOUND LOOPDBMS_OUTPUT.PUT_LINE(v_ename||’---‘||to_char(v_sal) );FETCH c_cursor INTO v_ename, v_sal;END LOOP;CLOSE c_cursor;END;DECLAREv_ename emp.ename%TYPE;v_sal emp.sal%TYPE;CURSOR c_cursor(P_sal emp.sal%type)IS SELECT ename, sal FROM emp WHERE sal >= P_sal; BEGINOPEN c_cursor(1000);FETCH c_cursor INTO v_ename, v_sal;WHILE c_cursor %FOUND LOOPDBMS_OUTPUT.PUT_LINE(v_ename||’---‘||to_char(v_sal) );FETCH c_cursor INTO v_ename, v_sal;END LOOP;CLOSE c_cursor;END;游标属性处理隐式游标显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE 系统定义的。

Oracle_PL_SQL讲解2(游标)

Oracle_PL_SQL讲解2(游标)
BEGIN SELECT salary INTO v_salary FROM
employees; DBMS_OUTPUT.PUT_LINE(' Salary is : '
|| v_salary); END;
home back first prev next last 7
显式游标
• 通过显式游标, 你可从数据库获取多条记录, 得到一个可指向每行记录的指针, 逐行处理 每条记录.
employees WHERE department_id = 10; v_empno employees.employee_id%TYPE; v_lname st_name%TYPE;
BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_empno, v_lname; DBMS_OUTPUT.PUT_LINE(v_empno || ' ' ||
• 要返回多行记录, 需要使用显式游标.
home back first prev next last 4
游标和上下文区域
• Oracle 服务为SQL语句分配一块私有内存区域用 于保存相关数据 ,此内存区称为上下文区域 ( context area ).
– 每个上下文区域(因而也就是每条 SQL 语句) 都有一个 关联的游标.
home back first prev next last 11
显式游标
home back first prev next last 12
显式游标
home back first prev next last 13
显式游标
• 游标的活动集由声明游标时给出的语句决定. • 语法:

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

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

『ORACLE』PLSQL动态游标的使⽤(11g)#静态游标指的是程序执⾏的时候不需要再去解析sql语⾔,对于sql语句的解析在编译的时候就可以完成的。

动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成。

从这个⾓度来说,静态游标的效率也⽐动态游标更⾼⼀些。

#游标的相关概念: 定义: 游标它是⼀个服务器端的存储区,这个区域提供给⽤户使⽤,在这个区域⾥ 存储的是⽤户通过⼀个查询语句得到的结果集,⽤户通过控制这个游标区域当中 的指针来提取游标中的数据,然后来进⾏操作。

实质: 是⽤户在远程客户端上对服务器内存区域的操作,由数据库为⽤户提供这样的 ⼀个指针,使得⽤户能够去检索服务器内存区的数据。

#游标具有的属性:1、%ISOPEN(确定游标是否已经打开 true or false)2、%FOUND(返回是否从结果集提取到了数据 true or false)3、%NOTFOUND(返回是否从结果集没有提取到数据 true or false)4、%ROWCOUNT(返回到当前为⽌已经提取到的实际⾏数)#游标分类⼀、静态游标1、隐式游标:对于select..into...语句,⼀次只能从数据库中获取到⼀条数据,对于这种类型的DML SQL语句,就是隐式cursorselect update/insert/delete操作2、显⽰游标:由程序员定义和管理,对于从数据库中提取多⾏数据,就需要使⽤显式cursor1)定义游标---cursor [cursor name] is2)打开游标---open [cursor name]3)操作数据---fetch [cursor name]4)关闭游标---close [cursor name]⼆、REF游标1、REF 游标:动态关联结果集的临时对象。

即在运⾏的时候动态决定执⾏查询。

2、REF 游标作⽤:实现在程序间传递结果集的功能,利⽤REF CURSOR也可以实现BULK SQL,从⽽提⾼SQL性能。

Oracle数据库实验-PLSQL游标、过程、函数、包的使用

Oracle数据库实验-PLSQL游标、过程、函数、包的使用

Oracle数据库实验-PLSQL游标、过程、函数、包的使用Oracle数据库基础实验5 PL/SQL游标、过程、函数、包的使用【实验学时】2学时【实验目的】1.了解PL/SQL语言中显式游标和隐式游标的概念和属性。

2.了解显式游标和隐式游标的差异。

3.掌握PL/SQL中cursor for循环的使用方法。

4.学会在PL/SQL程序中使用游标来解决实际问题。

5.学会在PL/SQL程序中进行异常处理的方法。

6.练习在PL/SQL中自定义异常。

7.理解过程和函数的作用。

8.学会编写过程、函数、包,并加以调用。

【实验内容】1.用显式游标编写程序,程序的功能是:计算每一个部门的平均工资。

注意异常的处理(例如,分母为0的异常)。

已写入文件afiedt.buf1 declare2 cursor c_dept is select * from dept order by deptno;3 cursor c_emp(p_dept emp.deptno%type)is selectename,sal from emp where deptno=p_dept4 order by ename;5 r_dept dept%rowtype;6 v_ename emp.ename%type;7 v_salary emp.sal%type;8 v_tot_salary emp.sal%type;9 begin10 open c_dept;11 loop12 fetch c_dept into r_dept;13 exit when c_dept%notfound;14dbms_output.put_line('department:'||r_dept.deptno||'-'||r_de pt.dname);15 v_tot_salary:=0;16 open c_emp(r_dept.deptno);17 loop18 fetch c_emp into v_ename,v_salary;19 exit when c_emp%notfound;20dbms_output.put_line('name:'||v_ename||'salary:'||v_salary);21 v_tot_salary:=v_tot_salary+v_salary;22 end loop;23 close c_emp;24 dbms_output.put_line('total salary fordept:'||v_tot_salary);25 end loop;26 close c_dept;27* end;SQL> /PL/SQL 过程已成功完成。

Oracle--plsql游标创建和使用

Oracle--plsql游标创建和使用

Oracle--plsql游标创建和使用为什么要游标:先看这个:DECLAREv_empnoemp.empno%type;v_enameemp.ename%type;BEGINSELECT empno,enameintov_ename,v_empnoFROM emp;dbms_output.put_line(v_empno||' '||v_ename);END;这个SELECT语句可能返回多条记录,所以这个赋值语句可能是错误的。

所以游标可以发挥作用了。

什么是游标?游标(cursor)是Oracle系统在内存中开辟的一个工作区,在其中存放SELECT语句返回的查询结果。

游标的分类:隐式游标:PL/SQL隐式建立并自动管理这一游标。

隐式游标也叫做SQL 游标。

对于SQL游标,不能对其显式地执行OPEN、CLOSE和FETCH 语句,但是可以使用游标属性从最近执行的SQL语句中获取信息。

显式游标:由程序员显式说明及控制,用于从表中取出多行数据,并将多行数据一行一行单独处理。

隐式游标:∙由Oracle在内部声明∙由Oracle自行管理游标∙可以使用游标属性从最近执行的SQL语句中获取信息∙用于处理DML语句以及返回单行的查询隐式游标属性:隐式游标举例:VARIABLE rows_deletedVARCHAR2(30)DECLAREv_deptno NUMBER := 20;BEGINDELETE FROM empWHERE deptno = v_deptno;:rows_deleted := (SQL%ROWCOUNT ||' rows deleted.');END;/返回所删除行的数量显式游标:由用户显式声明,查询返回多行记录∙使用游标时,select语句查询的结果可以是单条记录,多条记录,也可以是零条记录。

∙游标工作区中,存在着一个指针(POINTER),在初始状态它指向查询结果的首记录。

plsql--游标用法

plsql--游标用法

plsql--游标⽤法1.游标概念在 PL/SQL 块中执⾏ SELECT、INSERT、DELETE 和 UPDATE 语句时,ORACLE 会在内存中为其分配上下⽂区(Context Area),即缓冲区。

游标是指向该区的⼀个指针,或是命名⼀个⼯作区(Work Area),或是⼀种结构化数据类型。

它为应⽤等量齐观提供了⼀种对具有多⾏数据查询结果集中的每⼀⾏数据分别进⾏单独处理的⽅法,是设计嵌⼊式SQL 语句的应⽤程序的常⽤编程⽅式。

在每个⽤户会话中,可以同时打开多个游标,其数量由数据库初始化参数⽂件中的OPEN_CURSORS 参数定义。

对于不同的 SQL 语句,游标的使⽤情况不同:⾮查询语句--》隐式的结果是单⾏的查询语句 --》隐式的或显⽰的结果是多⾏的查询语句--》显⽰的2.处理显⽰游标2.1显⽰游标处理的4个步骤1.定义/ / 声明游标:就是定义⼀个游标名,以及与其相对应的 SELECT 语句。

格式:CURSOR cursor_name[(parameter[, parameter]…)][RETURN datatype]ISselect_statement;注意:1.游标参数只能为输⼊参数2.在指定数据类型时,不能使⽤长度约束3.[RETURN datatype]是可选的,表⽰游标返回数据的数据。

如果选择,则应该严格与 select_statement 中的选择列表在次序和数据类型上匹配。

⼀般是记录数据类型或带“%ROWTYPE”的数据。

2.打开游标就是执⾏游标所对应的 SELECT 语句,将其查询结果放⼊⼯作区,并且指针指向⼯作区的⾸部,标识游标结果集合。

如果游标查询语句中带有 FOR UPDATE 选项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据⾏。

格式:OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];3.提取游标就是检索结果集合中的数据⾏,放⼊指定的输出变量中。

03PLSQL中的游标(详解PLSQL游标)

03PLSQL中的游标(详解PLSQL游标)

FOR c1_rec IN c_cursor (30) LOOP
DBMS_OUTPUT.PUT_LINE(c1_rec.dname||’---‘||c1_rec.loc); END LOOP; DBMS_OUTPUT.PUT_LINE(CHR(10)||’使用默认的dept_no参数值10:’);
FOR c1_rec IN c_cursor LOOP
游标名是标识符,所以也有作用域,并且必须在使用前进行说明
任何SELECT语句都是合法的,但是SELECT …INTO语句是非法的 在声明部分的末尾声明游标*
1-4
显式游标
处理显式游标需要四个 PL/SQL步骤: 打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放 入工作区,并且指针指向工作区的首部,标识游标结果集合。 OPEN cursor_name 其中: PL/SQL 程序不能用OPEN 语句重复打开一个游标(ORA-06511)
1-2
游标的概念
对于不同的SQL语句,游标的使用情况不同:
SQL语句 非查询语句 结果是单行的查示的
1-3
显式游标
处理显式游标需要四个 PL/SQL步骤: 定义游标:就是定义一个游标名,以及与其相对应的SELECT 语句 , 其 一般形式为: CURSOR cursor_name IS select_statement; 其中: 游标声明部分是唯一可以出现在模块声明部分的步骤,其他三个 步骤都在执行和异常处理部分中
1-5
显式游标
处理显式游标需要四个 PL/SQL步骤:
提取游标:就是检索结果集合中的数据行,放入指定的输出变量中。
FETCH cursor_name INTO {variable_list | record_variable };

PLSQL的游标

PLSQL的游标

1、游标游标是指向结果集的指针,它提供一种机制,可以对结果集进行逐行处理。

游标分为显式游标和隐式游标。

显式游标是Oracle提供的一种访问数据的方法,让用户创建和使用;隐式游标是在执行selec t…into、delete、update、insert等语句时,由Oracle自动创建的一个游标,隐式游标一次只能返回一行,不能对其进行操作,由系统自动处理。

2、显式游标的使用:(一般用来处理select语句返回的多行数据)(1)声明游标:cursor cursorName [(arg1 datatype[,arg2 datatyp e…])]isselect_statement;解释:cursorName是游标名,arg1为游标的参数;datatype为参数类型,不能指定长度,只能是输入类型;select_statement是指定游标的查询语句。

select_statment还可以加锁,如:cursor emp_cursor is select * from emp for update [of emp] [nowait];解释:多个表时of选项指定要加锁的表;nowait选项表示锁未添加成功时,则返回并由用户决定等待还是去执行其他语句。

(2)打开游标:打开游标时,Oracle会执行游标所对应的查询语句,并将查询的结果集暂存到结果集中,此时结果集是静态的,对其所作的操作不会对结果集有影响,直到关闭游标后,对其所作的操作才会在结果集中反映出来。

open cursor_name;--打开游标,cursor_name为游标名。

(3)提取游标指向的数据:提取一行数据的语法:fetch cursorName into var1,var2,…;解释:将cursorName指向的行的数据提取出来赋值给var1等,每执行一次fetch语句,游标就会指向下一行。

提取多行数据的语法:fetch cursorName bulk collect into collect1,collect2,…[limit rows];解释:将游标指向的单行中的各列数据分别赋给各个变量(这里的变量相当于数组(单列多行型),保存多个值),然后取出下一行继续赋值,直到结束, limit指定取出的行数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DECLARE v_Major VARCHAR2(1000); v_PLSQLBlock VARCHAR2(1000); CURSOR c_EconMajor IS SELECT * FROM students WHERE major = v_Major ; -- 可以在定义游标的语句中使用前面已经定义的变量
游标提取循环
– 简单循环 – WHILE循环 – 游标式FOR循环
简单循环
使用简单循环LOOP…END LOOP;语法控制循环。
OPEN c_Cursor; LOOP FETCH c_Cursor INTO r_Cursor; EXIT WHEN c_Cursor%NOTFOUND; END LOOP;
参数化游标
CURSOR c_Class(p_Dep classes.department%TYPE, p_Course classes.course) IS SELECT * FROM classes WHERE department = p_Dep AND course = p_Course;
OPEN时将参数传递给游标
WHILE循环
使用 WHILE…LOOP语法构建提取循环。
OPEN c_HistoryStudents; FETCH c_HistoryStudents INTO v_StudentData; WHILE c_HistoryStudents%FOUND LOOP FETCH c_HistoryStudents INTO v_StudentData; END LOOP;
OPEN c_Class(‘HIS’,101);
隐式游标(SQL游标)
与显示游标不同的是,SQL游标不被程序打开和关闭,PL/SQL隐含 的打开SQL游标,处理其中的语句,然后关闭游标。 隐式游标用于处理INSERT, UPDATE, DELETE和单行的 SELECT…INTO语句。
具有以下属性 – SQL%NOTFOUND SQL%FOUND – SQL%ROWCOUNT – SELECT…INTO语句找不到任何行时,触 发 ORA-1403: no data found错误。
游标的属性
%FOUND %NOTFOUND %ISOPEN %ROWCOUNT
游标属性
%ISOPEN %FOUND %NOTFOUND
描述
BOOLEAN型,游标打开是返回TRUE。 BOOLEAN型,如果FETCH操作取得一行,返回 TURE。 BOOLEAN型, 与%FOUND相反。
%ROWCOUNT 数字型,返回到当前为止返回的纪录数。
– cursor_name是已经声明并打开的游标 – list_of_variable是已经被声明的变量的列表
– PL/SQL_record是已经被声明的PL/SQL记录。
– INTO子句中的变量类型必须与查询语句的选择列表的类型
兼容。
关闭游标
CLOSE cursor_name;
– cursor_name是原来已经打开的游标 – 一旦游标关闭就无法在提取数据
三.游标CURSOR
目标


完成本节课学习后,应当达到如下目标:
– 掌握处理游标所需的步骤。
– 通过游标的属性,对游标进行控制。 – 掌握不同种类的提取循环。
什么是游标
– 为了处理SQL语句,Oracle必须分配一片
内存区域,这就是context are。这个区域 包含了完成该语句的必需信息。 – 游标是指向context are的句柄或指针。通 过游标,PL/SQL程序可以控制context are 和在处理语句时context are发生些什么事 情。 – 游标可分为显示游标和隐式游标
– 讨论了不同的游标提取循环。
打开游标
OPEN cursor_name;
当游标打开时:
– 联编变量的取值被检查。 – 根据联编变量的取值,活动集被确定。 – 活动集的指针指向第一行。
从游标提取
FETCH cursor_name INTO list_of_variables; FETCH cursor_name INTO PL/SQL_record; 查询的INTO子句是FETCH语句的一部分。FETCH语句有以上两种形式。
游标式FOR循环
使用FOR循环,可以隐式地进行游标处理。
FOR v_StudentData IN c_HistoryStudents LOOP ….. END LOOP;
– FOR循环不需要OPEN, FETCH, CLOSE的语句。
– v_StudentData 变量不必要事先声明。
小结
– 讨论了处理游标所需的必要步骤。 – 讨论了游标的属性。
处理显示游标
显示游标的处理包括四个PL/SQL步骤:
– 声明游标(在声明部分) – 打开游标(在执行部分) – 将结果提取到PL/SQL变量中(在执行部分) – 关闭游标(在执行部分)
声明游标
CURSOR cursor-name IS SELECT-statement; 注:这里的SELECT-statement不包含 INTO 子句
相关文档
最新文档