转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> ORACLE >> 正文
PL/Sql循序渐进全面学习教程--Oracle         ★★★★

PL/Sql循序渐进全面学习教程--Oracle

作者:闵涛 文章来源:闵涛的学习笔记 点击数:5282 更新时间:2009/4/22 22:04:46
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动画制作技巧、帧的理论知识尤为重要
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台