|
217;; –– Leave inner loop only ... END LOOP Inner_Loop; ... END LOOP Outer_loop; END; 总结:本章内容较为繁杂,虽然不是很难,而且多数与其他高级语言有某种共性,但大家要多多练习,用实践来检验对某些含糊的猜测。
课程 十三 使用组合数据类型* 游标操纵数据 本课重点: 1、创建用户自定义的PLSQL记录 2、利用%ROWTYPE属性来创建记录 3、创建PLSQL表 4、描述记录、表、记录的表之间的区别 注意:以下实例中标点均为英文半角 一、合成数据类型 1、类型分为PLSQL记录和PLSQL表 2、包含内部组件 3、可重用 二、PLSQL记录 与3GL中的记录结构相似 与数据库表是两回事 是一个方便的途径FETCH一些行FROM一个表来进行相关处理。 标准语法格式我们暂不介绍,因为每本书上均有。 看例子: declare vjob 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;--体会有无此句与结果的影响 dbms_output.put_line (vtotal); end; / 主要看TYPE RECORD出现的位置。每一个例子都是可以成功执行的。 我们也可以利用原有的表结构: DECLARE EMP_RECORD EMP%ROWTYPE; 游标操纵数据 PLSQL游标提供了一种从数据库提取多行数据,然后对每行数据进行单独处理的方法。 一、两种游标: 显式游标 隐式游标 二、显式游标:操纵步骤如下:声明游标、打开游标、从游标中取回数据、关闭游标 三、声明游标: DECLARE CURSOR_NAME IS SELECT STATMENT 能够控制游标的,唯一参数是INIT.ORA中的OPEN_CURSORS,我原来以为是客户端最多可以打开多少个游标,但有本书上讲这是用于管理游标的内存的数量。 DECLARE CURSOR C_NAME IS SELECT ENAME FROM EMP WHERE DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE CITY_ID=‘BJ’) --- 说明游标可以用子查询 四、打开游标 OPEN CURSOR_NAME; 这时游标将它的指针指向活动集的开始,指针指向第一条记录的前面是因为它还没有执行FETCH命令。如果试图打开一个已经打开的游标,将出错: ORA-06511:PL/SQL:CURSOR ALREADY OPEN 我们可以这样: IF NOT C_NAME%ISOPEN THEN OPEN C_NAME; END IF; 五、从游标中取回数据 FETCH CURSOR_NAME INTO RECOR-LIST; 关闭游标:CLOSE CURSOR_NAME 六、实例: DECLARE myname varchar2(22); CURSOR C_NAME IS SELECT ENAME FROM EMP; begin IF NOT C_NAME%ISOPEN THEN OPEN C_NAME; end if; LOOP FETCH c_name into myname; dbms_output.put_line (myname); exit when c_name%notfound; end loop; close c_name; end; /--我们将对以上程序进行变形,形成复杂的光标利用。 DECLARE myname varchar2(22); thisdeptno scott.emp.deptno%type; CURSOR C_NAME IS SELECT ENAME,deptno FROM EMP order by deptno desc; begin IF NOT C_NAME%ISOPEN THEN OPEN C_NAME; end if; LOOP FETCH c_name into myname,thisdeptno; dbms_output.put_line (myname||'''',''''||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; / 我们增加变量,进行用了排序,使用了光标属性,大家看结果发生的变化,想想为什么。 实例精华!!!: DECLARE myname varchar2(22); ii number; thisdeptno scott.emp.deptno%type; CURSOR C_NAME IS SELECT * FROM EMP order by deptno desc; emp_record c_name%rowtype; begin ii:=1; for emp_record in c_name loop dbms_output.put_line(ii); ii:=ii+1; end loop; end; / --这里使用了游标FOR循环,在FOR循环的开始,进行、和END LOOP,分别隐式进行了游标的打开、FETCH和CLOSE。 我们甚至可以不声明游标:FOR emp_record in (SELECT * FROM DEPT) loop 这种技术被称为显式游标的自动化。 在上面,我们可以将一个表的所有字段输出,如我们将PUT_LINE的II改为emp_record.ename,就可以输出一个字段内容。 这种方式非常简单而且效率较高。 ---------------- 为了测试光标属性的重要性,我们做一个以下的过程: create or replace PROCEDURE change_salary (v_emp_id IN NUMBER, -- formal parameters v_new_salary IN NUMBER) IS BEGIN -- begin PL/SQL block UPDATE emp SET sal = v_new_salary WHERE empno = v_emp_id; COMMIT; END change_salary; / 这样,我们在匿名块中, UPDATE DEPT SET DNAME=''''MY DEPT'''' WHERE ....; IF SQL%FOUND THEN COMMIT; ELSE change_salary(7369,9000); END IF; 我们看到我们通过流程控制了不同的执行结果,对于过程,我们可以用以下几种方法调用: 在SQLPLUS中:CALL change_salary(7369,9000); EXECUTE change_salary(7369,9000); 在一个块中,如: begin change_salary(7369,9000); end; /
最后一课 异常处理本章重点: 1、定义PLSQL异常 2、列举不同的异常处理方法 3、捕获非预期的错误 4、描述异常的影响 5、定制异常的返回信息 一、PLSQL异常处理 异常是由ORACLE错误或显式的抛出一个错误产生的。 如何处理: 用一个处理程序来捕获它; 将它传递给CALLING ENVIRONMENT 二、异常的类型: ORACLE SERVER 预定义错误 非ORACLE SERVER 预定义错误,但也是ORACLE SERVER 的标准错误 用户自定义异常 三、捕捉异常的要点: Place the WHEN OTHERS clause after all other exception handling clauses.
You can have at most one WHEN OTHERS clause.
Begin exception-handling section of the block with the keyword EXCEPTION.
Define several exception handlers, each with their own set of actions, for the block.
When an exception occurs, PL/SQL will process only one handler before leaving the block. EXCEPTION WHEN exception1 [OR exception2 . . .] THEN statement1; 四、常用错误: NO_DATA_FOUND ORA-01403 TOO_MANY_ROWS ORA-01422 INVALID_CURSOR ORA-01001 ZERO_DIVIDE ORA-01476 DUP_VAL_ON_INDEX ORA-00001 五、实例 PROCEDURE elim_inventory (v_product_id IN s_product.id%TYPE) IS v_id s_product.id%TYPE; BEGIN SELECT id INTO v_id FROM s_product WHERE id = v_product_id; DELETE FROM s_inventory WHERE product_id = v_product_id; COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN ROLLBACK; TEXT_IO.PUT_LINE(TO_CHAR(v_product_id)|| ’ is invalid.’); WHEN TOO_MANY_ROWS THEN ROLLBACK; TEXT_IO.PUT_LINE(’Data corruption in S_PRODUCT.’); WHEN OTHERS THEN ROLLBACK; TEXT_IO.PUT_LINE(’Other error occurred.’); END elim_inventory; 在SCOTT环境中使用要稍加改动 六、使用non-predefined Oracle7 Server error DECLARE E_PRO EXCEPTION; PRAGMA EXCEPTION_INIT(E_PRO,ERROR_NUMBER); BEGIN ...... EXCEPTION WHEN E_PRO THEN DBMS_OUTPUT.PUT_LINE(''''ASDLKFJKASDJFASJDFLKASDF''''); ...... END; 七、用户自定义 exception EXCEPTION; RAISE exception; EXCEPTION WHEN E_PRO THEN DBMS_OUTPUT.PUT_LINE(''''ASDLKFJKASDJFASJDFLKASDF''''); ...... END; 这里,只有用户自定义异常是要显式声明的,其他两个不用。 在SUN OS5.8中,进行SVRMGRL> OERR ORA 01840 可返回信息 或查错误代码: HTTP://TECHNET.ORACLE.COM/DOC/SERVER.815/A67785/E1500.HTM &nbs
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页 [学习帮助]为什么学习那么的令人害怕呢.? [精彩网文]直面高三 [精彩网文]学习成功=100%的学习意愿+100%的切实行动 [办公软件]学习PowerPoint心得体会 [网络安全]菜鸟学习—认识无线网络安全技术规范 [Web开发]如何学习Asp.net九步曲—菜鸟导读 [Web开发]最简单的AJAX 无刷新学习例子(示例,包含代码和完… [Web开发]推荐学习的与NET相关的⑩项技术 [平面设计]Flash动画学习心得体会 [平面设计]学习Flash动画制作技巧、帧的理论知识尤为重要
|