Oracle10g数据库管理系统.ppt

上传人:小飞机 文档编号:6513352 上传时间:2023-11-08 格式:PPT 页数:142 大小:1,004.50KB
返回 下载 相关 举报
Oracle10g数据库管理系统.ppt_第1页
第1页 / 共142页
Oracle10g数据库管理系统.ppt_第2页
第2页 / 共142页
Oracle10g数据库管理系统.ppt_第3页
第3页 / 共142页
Oracle10g数据库管理系统.ppt_第4页
第4页 / 共142页
Oracle10g数据库管理系统.ppt_第5页
第5页 / 共142页
点击查看更多>>
资源描述

《Oracle10g数据库管理系统.ppt》由会员分享,可在线阅读,更多相关《Oracle10g数据库管理系统.ppt(142页珍藏版)》请在三一办公上搜索。

1、实用数据库技术,第7章 Oracle10g数据库管理系统,学习内容,Oracle 概述Oracle 10g数据库安装Oracle 10g数据库卸载 Oracle 10g常用管理工具Oracle10g表管理使用过程和触发器,Oracle 概述,Oracle公司 Oracle数据库,Oracle 10g数据库安装,服务器安装需求版本企业版标准版个人版最低配置 CPU:Pentium 166 内存:128MB 硬盘空间:企业版(176GB):标准版(176GB):个人版(172GB)视频:256色,Oracle 10g数据库安装,客户端安装需求安装类型 管理者(administrator)运行时环境

2、(runtime)自定义(custom)最低配置 CPU:Pentium 166 内存:128MB 硬盘空间:管理者(647MB):运行时环境(486MB),Oracle 10g数据库安装过程,(略),Oracle 数据库卸载,1、停止服务 2、卸载Oracle产品3、清理注册表4、清理环境变量5、清理磁盘,Oracle卸载 1/5,开始设置控制面板管理工具服务停止所有Oracle服务,Oracle卸载 2/5,开始程序Oracle Installation Products Universal Installer 卸装所有Oracle产品,但Universal Installer本身不能被删

3、除,Oracle卸载 3/5,运行regeditHKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices 滚动这个列表,删除所有Oracle入口。HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication,除所有Oracle入口。,Oracle卸载 4/5,开始设置控制面板系统高级环境变量 删除环境变量CLASSPATH和PATH中有关Oracle的设定,Oracle卸载 5/5,从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标 删除Prog

4、ram FilesOracle目录 重新启动计算机,重起后才能完全删除Oracle所在目录,删除与Oracle有关的文件,选择Oracle所在的缺省目录C:Oracle,删除这个入 口目录及所有子目录,并从Windows 2000目录(一般为C:WINNT)下删除以下文件ORACLE.INI、oraodbc.ini等等。,Oracle10g常用管理工具,OEM控制台SQL*PLUS工具介绍,Oracle10g表管理,在Oracle中建表,主要有两种方式:一种是在SQL*PLUS中执行建表的SQL语句。另一种是通过OEM工具。,Oracle10g数据中的数据类型,PL/SQL语言基础,注释变量声

5、明运算符PL/SQL块结构控制语句,PL/SQL 程序设计简介,PL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。,SQL与PL/SQL,PL/SQL是 Procedure Language&Structured Query Language 的缩写。ORACLE的SQL是支持ANSI(American national Standards Institute)和ISO9

6、2(International Standards Organization)标准的产品。PL/SQL是对SQL语言存储过程语言的扩展。,为什么使用PL/SQL,有利于客户/服务器环境应用的运行 适合于客户环境,PL/SQL块结构,PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。,DECLARE/*声明部分:在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数*/BEGIN/*执行部分:过程及SQL 语句,即程序的主要部分*/EXCEPTION/*执行异常部分:错误处理*/END;,PL/SQL块可以分为三类,无名块:动态构造,只能执行一次。子程序:存储在数据

7、库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。,标识符,PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有:标识符名不能超过30字符;第一个字符必须为字母;不分大小写;不能用-(减号);不能是SQL保留字。,实例,下面的例子将会删除所有的纪录,而不是KING 的记录。,DECLARE v_ename varchar2(20):=KING;BEGIN DELETE FROM emp WHERE ename=v_ename;END;,如何运行PL/SQL块结构?,如何运行P

8、L/SQL块结构?,建议的命名方法,PL/SQL 变量类型实例,插入一条记录并显示,DECLARE Row_id ROWID;info VARCHAR2(40);BEGININSERT INTO dept VALUES(90,SERVICE,BEIJING)RETURNING rowid,dname|:|to_char(deptno)|:|locINTO row_id,info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;,PL/SQL 变量类型实例,其中,RETURNING子句用于检索INSERT语句中

9、所影响的数据行数,当INSERT语句使用VALUES 子句插入数据时,RETURNING 子句还可将列表达式、ROWID和REF值返回到输出变量中。在使用RETURNING 子句是应注意以下几点限制:不能并行DML语句;不能检索LONG 类型信息;当通过视图向基表中插入数据时,只能与单基表视图一起使用。,PL/SQL 变量类型实例,修改一条记录并显示,DECLARE Row_id ROWID;info VARCHAR2(40);BEGINUPDATE dept SET deptno=80 WHERE DNAME=SERVICERETURNING rowid,dname|:|to_char(de

10、ptno)|:|locINTO row_id,info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;,PL/SQL 变量类型实例,其中,RETURNING子句用于检索被修改行信息,当UPDATE语句修改单行数据时,RETURNING 子句可以检索被修改行的ROWID值,以及行中被修改列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据时,RETURNING 子句可以将被修改行的ROWID值,以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING 子

11、句的限制与INSERT语句中对RETURNING子句的限制相同。,PL/SQL 变量类型实例,删除一条记录并显示,DECLARE Row_id ROWID;info VARCHAR2(40);BEGINDELETE dept WHERE DNAME=SERVICERETURNING rowid,dname|:|to_char(deptno)|:|locINTO row_id,info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;,PL/SQL 变量类型实例,RETURNING子句用于检索被删除行信息,当D

12、ELETE语句修改单行数据时,RETURNING 子句可以检索被删除行的ROWID,以及被删除行中列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据时,RETURNING 子句可以将被修改行的ROWID,以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。,复合类型,ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型-记录和表。记录类型使用%TYPE使用%ROWTYPE,记录类型,记录类型是把逻辑相关的数据作为一个单元存储

13、起来,它必须包括至少一个标量型(数字型、字符型、布尔型、日期型)或RECORD 数据类型的成员,称作PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息。,定义记录类型语法如下:,TYPE record_type IS RECORD(Field1 type1 NOT NULL:=exp1,Field2 type2 NOT NULL:=exp2,.Fieldn typen NOT NULL:=expn);,实例,DECLARE TYPE test_rec IS RECORD(Code VARCHAR2(10),Name VARCHAR2(30)NOT NULL:=

14、a book);V_book test_rec;BEGIN V_book.code:=123;V_book.name:=C+Programming;DBMS_OUTPUT.PUT_LINE(v_book.code|v_book.name);END;,使用%TYPE,定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。使用%TYPE特性的优点在于:所引用的数据库列的数据类型可以不必知道;所引用的数据库列的数据类型可以实时改变。,实例 1,DECLARE-用%TYPE 类型定义与表相配的字段 TYPE t_Record IS R

15、ECORD(T_no emp.empno%TYPE,T_name emp.ename%TYPE,T_sal emp.sal%TYPE);-声明接收数据的变量 v_emp t_Record;BEGIN SELECT empno,ename,sal INTO v_emp FROM emp WHERE empno=7788;DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp.t_no)|v_emp.t_name|TO_CHAR(v_emp.t_sal);END;,实例 2,DECLARE v_empno emp.empno%TYPE:=,使用%ROWTYPE,PL/SQL 提供%R

16、OWTYPE操作符,返回一个记录类型,其数据类型和数据库表的数据结构相一致。使用%ROWTYPE特性的优点在于:所引用的数据库中列的个数和数据类型可以不必知道;所引用的数据库中列的个数和数据类型可以实时改变。,实例,DECLARE v_empno emp.empno%TYPE:=,运算符和表达式,算术运算符,运算符和表达式,关系运算符,运算符和表达式,逻辑运算符,变量赋值,在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下:variable 是一个PL/SQL变量,expression 是一个PL/SQL 表达式。,variable:=expression;,字符及数字运算特点,

17、空值加数字仍是空值:NULL+=NULL空值加(连接)字符,结果为字符:NULL|=,BOOLEAN 赋值,布尔值只有TRUE,FALSE及 NULL 三个值。如:,DECLAREdone BOOLEAN;/*the following statements are legal:*/BEGIN done:=FALSE;WHILE NOT done LOOP Null;END LOOP;END;,游标赋值,游标赋值是通过 SELECT语句来完成的,每次执行 SELECT语句就赋值一次,一般要求被赋值的变量与SELECT中的列名要一一对应。,游标赋值,DECLAREemp_id emp.empno

18、%TYPE:=7788;emp_name emp.ename%TYPE;wages emp.sal%TYPE;BEGINSELECT ename,NVL(sal,0)+NVL(comm,0)INTO emp_name,wages FROM emp WHERE empno=emp_id;DBMS_OUTPUT.PUT_LINE(emp_name|-|to_char(wages);END;结果:SCOTT-3000,可转换的类型赋值,CHAR 转换为 NUMBER:使用 TO_NUMBER 函数来完成字符到数字的转换,如:v_total:=TO_NUMBER(100.0)+sal;NUMBER 转

19、换为CHAR:使用 TO_CHAR函数可以实现数字到字符的转换,如:v_comm:=TO_CHAR(123.45)|元;字符转换为日期:使用 TO_DATE函数可以实现 字符到日期的转换,如:v_date:=TO_DATE(2001.07.03,yyyy.mm.dd);日期转换为字符:使用 TO_CHAR函数可以实现日期到字符的转换,如:v_to_day:=TO_CHAR(SYSDATE,yyyy.mm.dd hh24:mi:ss);,变量作用范围及可见性,PL/SQL的变量作用范围特点是:变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束。一个变量(标识)

20、只能在你所引用的块内是可见的。当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量的空间(因为它可能不用了)。在子块中重新定义该变量后,它的作用仅在该块内。,实例,DECLARE Emess char(80);BEGIN DECLARE V1 NUMBER(4);BEGIN SELECT empno INTO v1 FROM emp WHERE LOWER(job)=president;DBMS_OUTPUT.PUT_LINE(V1);EXCEPTION When TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(More than one presid

21、ent);END;,实例 续,DECLARE V1 NUMBER(4);BEGIN SELECT empno INTO v1 FROM emp WHERE LOWER(job)=manager;EXCEPTION When TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(More than one manager);END;EXCEPTION When others THEN Emess:=substr(SQLERRM,1,80);DBMS_OUTPUT.PUT_LINE(emess);END;,注释,在PL/SQL里,可以使用两种符号来写注释,即:使用双-(减

22、号)加注释 V_Sal NUMBER(12,2);-工资变量。使用/*/来加一行或多行注释/*/*文件名:department_salary.sql*/*/,示例 简单数据插入例子,DECLAREv_ename VARCHAR2(20):=Bill;v_sal NUMBER(7,2):=1234.56;v_deptno NUMBER(2):=10;v_empno NUMBER(4):=8888;BEGININSERT INTO emp(empno,ename,JOB,sal,deptno,hiredate)VALUES(v_empno,v_ename,Manager,v_sal,v_deptn

23、o,TO_DATE(1954.06.09,yyyy.mm.dd);COMMIT;END;,示例 简单数据删除例子,DECLAREv_empno number(4):=8888;BEGINDELETE FROM emp WHERE empno=v_empno;COMMIT;END;,PL/SQL流程控制语句,PL/SQL的流程控制语句包括如下三类:控制语句:IF 语句;循环语句:LOOP语句,EXIT语句;顺序语句:GOTO语句,NULL语句。,条件语句,IF THEN PL/SQL 和 SQL语句END IF;,IF THENPL/SQL 和 SQL语句ELSE其它语句END IF;,条件语句

24、,IF THEN PL/SQL 和 SQL语句ELSIF THEN 其它语句ELSIF THEN 其它语句ELSE 其它语句END IF;,条件语句 实例,DECLARE v_empno emp.empno%TYPE:=,CASE 表达式,CASE selectorWHEN expression1 THEN result1WHEN expression2 THEN result2WHEN expressionN THEN resultN ELSE resultN+1END;,CASE 表达式 实例,DECLAREV_grade char(1):=UPPER(,CASE 表达式 实例,代码运行结

25、果:Enter value for p_grade:Aold 2:V_grade char(1):=UPPER(Grade:A Appraisal:Excellent,循环,简单循环,LOOP 要执行的语句;EXIT WHEN/*条件满足,退出循环语句*/END LOOP;,LOOP循环 实例,DECLARE int NUMBER(2):=0;BEGIN LOOP int:=int+1;DBMS_OUTPUT.PUT_LINE(int 的当前值为:|int);EXIT WHEN int=10;END LOOP;END;,循环,WHILE 循环,WHILE LOOP 要执行的语句;END LOO

26、P;,WHILE循环 实例,DECLARE x NUMBER:=1;BEGIN WHILE x=10 LOOP DBMS_OUTPUT.PUT_LINE(X的当前值为:|x);x:=x+1;END LOOP;END;,循环,数字式循环每循环一次,循环变量自动加1,使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。,FOR 循环计数器 IN REVERSE 下限.上限 LOOP 要执行的语句;END LOOP;,数字式循环 实例,BEGIN FOR int in 1.10 LOOP

27、 DBMS_OUTPUT.PUT_LINE(int 的当前值为:|int);END LOOP;END;,数字式循环 实例,CREATE TABLE temp_table(num_col NUMBER);DECLAREV_counter NUMBER:=10;BEGIN INSERT INTO temp_table(num_col)VALUES(v_counter);FOR v_counter IN 20.25 LOOP INSERT INTO temp_table(num_col)VALUES(v_counter);END LOOP;INSERT INTO temp_table(num_col

28、)VALUES(v_counter);FOR v_counter IN REVERSE 20.25 LOOP INSERT INTO temp_table(num_col)VALUES(v_counter);END LOOP;END;DROP TABLE temp_table;,GOTO和标签,标号是用括起来的标识符,GOTO label;,GOTO和标签 实例,DECLARE V_counter NUMBER:=1;BEGIN LOOP DBMS_OUTPUT.PUT_LINE(V_counter的当前值为:|V_counter);V_counter:=v_counter+1;IF v_co

29、unter 10 THEN GOTO l_ENDofLOOP;END IF;END LOOP;DBMS_OUTPUT.PUT_LINE(V_counter的当前值为:|V_counter);END;,NULL 语句,DECLARE.BEGIN IF v_num IS NULL THEN GOTO print1;END IF;NULL;-不需要处理任何数据。END;,游标概念,为了处理 SQL 语句获取一个表中记录,ORACLE提供一个上下文,它提供了一个指向语句的指针以及查询的活动集(active set)。游标是一个指向上下文的句柄(handle)或指针。通过游标,PL/SQL可以控制上下文

30、区和处理语句时上下文区会发生些什么事情。,游标概念,对于不同的SQL语句,游标的使用情况不同:,处理显式游标,显式游标处理需四个 PL/SQL步骤:定义游标 格式:CURSOR cursor_name IS select_statement;打开游标 格式:OPEN cursor_name;提取游标数据 格式:FETCH cursor_name INTO variable_list|record_variable;关闭游标 格式:CLOSE cursor_name;,示例 1,DECLARE CURSOR c_cursor IS SELECT ename,sal FROM emp WHERE

31、rownum11;v_ename emp.ename%TYPE;v_sal emp.sal%TYPE;BEGINOPEN c_cursor;FETCH c_cursor INTO v_ename,v_sal;WHILE c_cursor%FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_ename|-|to_char(v_sal);FETCH c_cursor INTO v_ename,v_sal;END LOOP;CLOSE c_cursor;END;,示例 2,DECLAREDeptRec dept%ROWTYPE;Dept_name dept.dname%TYPE;De

32、pt_loc dept.loc%TYPE;CURSOR c1 IS SELECT dname,loc FROM dept WHERE deptno=30;CURSOR c2(dept_no NUMBER DEFAULT 10)ISSELECT dname,loc FROM dept WHERE deptno=dept_no;CURSOR c3(dept_no NUMBER DEFAULT 10)IS SELECT*FROM dept WHERE deptno=dept_no;BEGINOPEN c1;LOOPFETCH c1 INTO dept_name,dept_loc;EXIT WHEN

33、c1%NOTFOUND;DBMS_OUTPUT.PUT_LINE(dept_name|-|dept_loc);END LOOP;,示例 2 续,CLOSE c1;OPEN c2;LOOPFETCH c2 INTO dept_name,dept_loc;EXIT WHEN c2%NOTFOUND;DBMS_OUTPUT.PUT_LINE(dept_name|-|dept_loc);END LOOP;CLOSE c2;OPEN c3(dept_no=20);LOOPFETCH c3 INTO deptrec;EXIT WHEN c3%NOTFOUND;DBMS_OUTPUT.PUT_LINE(de

34、ptrec.deptno|-|deptrec.dname|-|deptrec.loc);END LOOP;CLOSE c3;END;,游标属性,%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为TRUE;%NOTFOUND 布尔型属性,与%FOUND相反;%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;%ROWCOUNT 数字型属性,返回已从游标中读取的记录数。,示例,DECLARE v_empno emp.empno%TYPE;v_sal emp.sal%TYPE;CURSOR c_cursor IS SELECT empno,sal FROM emp;BEGIN OPE

35、N c_cursor;LOOP FETCH c_cursor INTO v_empno,v_sal;EXIT WHEN c_cursor%NOTFOUND;IF v_sal=1200 THEN UPDATE emp SET sal=sal+50 WHERE empno=v_empno;DBMS_OUTPUT.PUT_LINE(编码为|v_empno|工资已更新!);END IF;DBMS_OUTPUT.PUT_LINE(记录数:|c_cursor%ROWCOUNT);END LOOP;CLOSE c_cursor;END;,游标的FOR循环,FOR index_variable IN curs

36、or_namevalue,value LOOP-游标数据处理代码END LOOP;,游标中使用FOR循环示例,DECLARE CURSOR c_sal IS SELECT empno,ename,sal FROM emp;BEGIN-隐含打开游标 FOR v_sal IN c_sal LOOP-隐含执行一个FETCH语句 DBMS_OUTPUT.PUT_LINE(to_char(v_sal.empno)|-|v_sal.ename|-|to_char(v_sal.sal);-隐含监测c_sal%NOTFOUND END LOOP;-隐含关闭游标END;,有参数游标中使用FOR循环示例,DECL

37、ARECURSOR c_cursor(dept_no NUMBER DEFAULT 10)ISSELECT dname,loc FROM dept WHERE deptno 30)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 LOOPDBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc);END LOOP;END;,游标FOR循环语句中使用子查询

38、来实现游标 实例,BEGINFOR c1_rec IN(SELECT dname,loc FROM dept)LOOPDBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc);END LOOP;END;,处理隐式游标,当查询返回结果超过一行时,就需要一个显式游标。显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、

39、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL 语句所包含的数据。,处理隐式游标,格式调用为:SQL%当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。,处理隐式游标,隐式游标只使用SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOU

40、NT三个属性,SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。,处理隐式游标,SQL%FOUND,布尔型属性,当最近一次读记录时成功返回,则值为TRUE。在执行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是:INSERT为TRUE;DELETE和UPDATE,至少有一行被DELETE或UPDATE为TRUE;SELECT INTO至少返回一行为TRUE;SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。,处理隐式游标 示例,DECLAREV_deptno

41、 emp.deptno%TYPE:=,异常错误处理,异常情况处理是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行。,有三种类型的异常:,预定义(Predefined)异常ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。非预定义(Predefined)异常即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。用户定义(User_define)异常程序执行过程中,出现编程

42、人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。,异常处理部分结构,EXCEPTION WHEN first_exception THEN WHEN second_exception THEN WHEN OTHERS THEN END;,预定义的异常处理,实例,DECLARE v_empno emp.empno%TYPE:=,非预定义的异常处理,非定义的ORACLE错误进行定义,步骤如下:1.在PL/SQL 块的定义部分定义异常情况:EXCEPTION;2.将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句

43、:PRAGMA EXCEPTION_INIT(,);3.在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。,示例,INSERT INTO dept VALUES(50,FINANCE,CHICAGO);DECLARE v_deptno dept.deptno%TYPE:=,存储函数和过程,ORACLE 提供可以把PL/SQL 程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过

44、程则不返回数据。在本节中主要介绍:创建存储过程和函数;建立和管理存储过程和函数。,创建函数,语法如下:,CREATE or REPLACE FUNCTION function_name(argment in|in out TYPE,argment in|out|in out type RETURN RETURN_type IS|AS BEGIN FUNCTION_bodyEXCEPTION.END function_name;,创建函数 示例,CREATE OR REPLACE FUNCTION get_salary(Dept_no NUMBER,Emp_count OUT NUMBER)RE

45、TURN NUMBER ISV_sum NUMBER;BEGINSELECT SUM(sal),count(*)INTO V_sum,emp_countFROM emp WHERE deptno=dept_no;RETURN v_sum;EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(你需要的数据不存在!);WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END get_salary;,函数的调用,格式为:argument_value1,argument_value2

46、,函数的调用 实例,DECLAREV_num NUMBER;V_sum NUMBER;BEGINV_sum:=get_salary(30,v_num);DBMS_OUTPUT.PUT_LINE(30号部门工资总和:|v_sum|,人数:|v_num);END;运行结果:30号部门工资总和:9400,人数:6,创建过程,创建过程语法:,CREATE OR REPLACE PROCEDURE Procedure_name(argment IN|OUT|IN OUT Type,argment IN|OUT|IN OUT Type AUTHID DEFINER|CURRENT_USER IS|AS B

47、EGINEXCEPTIONEND;,实例 1,CREATE table logtable(userid VARCHAR2(10),logdate date);CREATE OR REPLACE PROCEDURE logexecution ISBEGININSERT INTO logtable(userid,logdate)VALUES(USER,SYSDATE);END;,实例 2,CREATE OR REPLACE PROCEDURE DelEmp(v_empno IN emp.empno%TYPE)ASNo_result EXCEPTION;BEGIN DELETE FROM emp W

48、HERE empno=v_empno;IF SQL%NOTFOUND THEN RAISE no_result;END IF;DBMS_OUTPUT.PUT_LINE(编码为|v_empno|的员工已被除名!);EXCEPTION WHEN no_result THEN DBMS_OUTPUT.PUT_LINE(你需要的数据不存在!);WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END DelEmp;,实例 3,CREATE OR REPLACE PROCEDURE InsertEmp(v_empno in emp.empn

49、o%TYPE,v_name in emp.ename%TYPE,v_deptno in emp.deptno%TYPE)AS empno_remaining EXCEPTION;PRAGMA EXCEPTION_INIT(empno_remaining,-1);/*-1 是违反唯一约束条件的错误代码*/BEGIN INSERT INTO emp(empno,ename,hiredate,deptno)VALUES(v_empno,v_name,sysdate,v_deptno);DBMS_OUTPUT.PUT_LINE(插入数据记录成功!);EXCEPTION WHEN empno_remai

50、ning THEN DBMS_OUTPUT.PUT_LINE(违反数据完整性约束!);WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END InsertEmp;,调用存储过程,ORACLE 使用EXECUTE 语句来实现对存储过程的调用:EXECUTE Procedure_name(parameter1,parameter2);,存储过程和调用 实例1,CREATE OR REPLACE PROCEDURE QueryEmp(v_empno IN emp.empno%TYPE,v_ename OUT emp.ename%TYP

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号