课程十三 使用组合数据类型 游标操纵数据

上传人:kms****20 文档编号:41299017 上传时间:2018-05-29 格式:DOC 页数:6 大小:29KB
返回 下载 相关 举报
课程十三 使用组合数据类型 游标操纵数据_第1页
第1页 / 共6页
课程十三 使用组合数据类型 游标操纵数据_第2页
第2页 / 共6页
课程十三 使用组合数据类型 游标操纵数据_第3页
第3页 / 共6页
课程十三 使用组合数据类型 游标操纵数据_第4页
第4页 / 共6页
课程十三 使用组合数据类型 游标操纵数据_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《课程十三 使用组合数据类型 游标操纵数据》由会员分享,可在线阅读,更多相关《课程十三 使用组合数据类型 游标操纵数据(6页珍藏版)》请在金锄头文库上搜索。

1、课程十三课程十三 使用组合数据类型使用组合数据类型 游标操纵数据游标操纵数据课程十三 使用组合数据类型* 游标操纵数据本课重点:1、创建用户自定义的 PLSQL 记录2、利用%ROWTYPE 属性来创建记录3、创建 PLSQL 表4、描述记录、表、记录的表之间的区别注意:以下实例中标点均为英文半角一、合成数据类型1、类型分为 PLSQL 记录和 PLSQL 表2、包含内部组件3、可重用二、PLSQL 记录与 3GL 中的记录结构相似与数据库表是两回事是一个方便的途径 FETCH 一些行 FROM 一个表来进行相关处理。标准语法格式我们暂不介绍,因为每本书上均有。看例子:declarevjob

2、varchar(9);v_count number:=0;vtotal date:=sysdate +7;c_tax constant number(3,2):=8.25;v_valid boolean not null:=true;ttt vtotal%type;type emp_record_type is record(empno number not null:=100,ename emp.ename%type,job emp.job%type);emp_record emp_record_type;begin-select sysdate into vtotal from dual;

3、-体会有无此句与结果的影响dbms_output.put_line (vtotal);end;/主要看 TYPE RECORD 出现的位置。每一个例子都是可以成功执行的。我们也可以利用原有的表结构:DECLAREEMP_RECORD EMP%ROWTYPE;游标操纵数据PLSQL 游标提供了一种从数据库提取多行数据,然后对每行数据进行单独处理的方法。一、两种游标:显式游标隐式游标二、显式游标:操纵步骤如下:声明游标、打开游标、从游标中取回数据、关闭游标三、声明游标:DECLARE CURSOR_NAMEISSELECT STATMENT能够控制游标的,唯一参数是 INIT.ORA 中的 OPE

4、N_CURSORS,我原来以为是客户端最多可以打开多少个游标,但有本书上讲这是用于管理游标的内存的数量。DECLARECURSOR C_NAMEISSELECT ENAME FROM EMPWHERE DEPTNO IN (SELECT DEPTNO FROM DEPTWHERE CITY_ID=BJ)- 说明游标可以用子查询四、打开游标OPEN CURSOR_NAME;这时游标将它的指针指向活动集的开始,指针指向第一条记录的前面是因为它还没有执行 FETCH 命令。如果试图打开一个已经打开的游标,将出错:ORA-06511:PL/SQL:CURSOR ALREADY OPEN我们可以这样:I

5、F NOT C_NAME%ISOPENTHENOPEN C_NAME;END IF;五、从游标中取回数据FETCH CURSOR_NAME INTO RECOR-LIST;关闭游标:CLOSE CURSOR_NAME六、实例:DECLAREmyname varchar2(22);CURSOR C_NAMEISSELECT ENAME FROM EMP;beginIF NOT C_NAME%ISOPENTHENOPEN C_NAME;end if;LOOPFETCH c_name into myname;dbms_output.put_line (myname);exit when c_name

6、%notfound;end loop;close c_name;end;/-我们将对以上程序进行变形,形成复杂的光标利用。DECLAREmyname varchar2(22);thisdeptno scott.emp.deptno%type;CURSOR C_NAMEISSELECT ENAME,deptno FROM EMP order by deptno desc;beginIF NOT C_NAME%ISOPENTHENOPEN C_NAME;end if;LOOPFETCH c_name into myname,thisdeptno;dbms_output.put_line (myna

7、me|,|thisdeptno | , | to_char(c_name%rowcount);exit when c_name%notfound;end loop;dbms_output.put_line (the Total record is fetched is | to_char(c_name%rowcount);close c_name;end;/我们增加变量,进行用了排序,使用了光标属性,大家看结果发生的变化,想想为什么。实例精华!: DECLAREmyname varchar2(22);ii number;thisdeptno scott.emp.deptno%type;CURS

8、OR C_NAMEISSELECT * FROM EMP order by deptno desc;emp_record c_name%rowtype;beginii:=1;for emp_record in c_name loopdbms_output.put_line(ii);ii:=ii+1;end loop;end;/-这里使用了游标 FOR 循环,在 FOR 循环的开始,进行、和END LOOP,分别隐式进行了游标的打开、FETCH 和 CLOSE。我们甚至可以不声明游标:FOR emp_record in (SELECT * FROM DEPT) loop这种技术被称为显式游标的自

9、动化。在上面,我们可以将一个表的所有字段输出,如我们将PUT_LINE 的 II 改为 emp_record.ename,就可以输出一个字段内容。这种方式非常简单而且效率较高。-为了测试光标属性的重要性,我们做一个以下的过程:create or replace PROCEDURE change_salary(v_emp_id IN NUMBER, - formal parametersv_new_salary IN NUMBER)ISBEGIN - begin PL/SQL blockUPDATE empSET sal = v_new_salaryWHERE empno = v_emp_id;COMMIT;END change_salary;/这样,我们在匿名块中,UPDATE DEPTSET DNAME=MY DEPT WHERE .;IF SQL%FOUND THENCOMMIT;ELSEchange_salary(7369,9000);END IF;我们看到我们通过流程控制了不同的执行结果,对于过程,我们可以用以下几种方法调用:在 SQLPLUS 中:CALL change_salary(7369,9000);EXECUTE change_salary(7369,9000);在一个块中,如:beginchange_salary(7369,9000);end;/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号