Oracle10g数据库管理系统7901.pptx
实用数据库技术实用数据库技术Oracle10g数据库管理系统学习内容学习内容lOracle概述lOracle10g数据库安装lOracle10g数据库卸载lOracle10g常用管理工具lOracle10g表管理l使用过程和触发器Oracle 概述概述lOracle公司lOracle数据库Oracle 10g数据库安装数据库安装l服务器安装需求l版本l企业版l标准版l个人版l最低配置CPU:Pentium166内存:128MB硬盘空间:企业版(176GB):标准版(176GB):个人版(172GB)视频:256色Oracle 10g数据库安装数据库安装l客户端安装需求l安装类型l管理者(administrator)l运行时环境(runtime)l自定义(custom)l最低配置CPU:Pentium166内存:128MB硬盘空间:管理者(647MB):运行时环境(486MB)Oracle 10g数据库安装数据库安装过程过程l(略)Oracle 数据库数据库卸载卸载 l1、停止服务l2、卸载Oracle产品l3、清理注册表l4、清理环境变量l5、清理磁盘Oracle卸载卸载 1/5l开始设置控制面板管理工具服务停止所有Oracle服务Oracle卸载卸载 2/5l开始程序OracleInstallationProductsUniversalInstallerl卸装所有Oracle产品,但UniversalInstaller本身不能被删除Oracle卸载卸载 3/5l运行regeditlHKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices滚动这个列表,删除所有Oracle入口。lHKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication,除所有Oracle入口。Oracle卸载卸载 4/5l开始设置控制面板系统高级环境变量l删除环境变量CLASSPATH和PATH中有关Oracle的设定Oracle卸载卸载 5/5l从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标l删除ProgramFilesOracle目录l重新启动计算机,重起后才能完全删除Oracle所在目录,l删除与Oracle有关的文件,选择Oracle所在的缺省目录C:Oracle,删除这个入口目录及所有子目录,并从Windows2000目录(一般为C:WINNT)下删除以下文件ORACLE.INI、oraodbc.ini等等。Oracle10g常用管理工具常用管理工具lOEM控制台lSQL*PLUS工具介绍Oracle10g表管理表管理l在Oracle中建表,主要有两种方式:l一种是在SQL*PLUS中执行建表的SQL语句。l另一种是通过OEM工具。Oracle10g数据中的数据类型数据中的数据类型 数据类型数据类型类型说明类型说明CHAR字符型,最长为字符型,最长为2000BNCHAR基于字符集的字符型,同上基于字符集的字符型,同上VARCHAR2 变长字符型,最长为变长字符型,最长为4000BNVARCHAR2基于字符集的变长字符型,同上基于字符集的变长字符型,同上VARCHAR 同同VARCHAR2LONG变长字符型,最长为变长字符型,最长为2GBNUMBER(s,d)数字型,总位数为数字型,总位数为s位,小数位为位,小数位为d位,总长最大为位,总长最大为38位位DATE 日期型日期型RAW纯二进制数据类型,最长为纯二进制数据类型,最长为2000BLONG RAW 变长二进制数据类型,最长为变长二进制数据类型,最长为2GBBLOB二进制大对象类型,最长为二进制大对象类型,最长为4GBNLOB包含定宽的多位数字符的字符大对象类型,最长为包含定宽的多位数字符的字符大对象类型,最长为4GBCLOB包含单个字符的字符大对象类型,最长为包含单个字符的字符大对象类型,最长为4GBBFILE数据库外的大型二进制文件的输入指示器类型,最大为数据库外的大型二进制文件的输入指示器类型,最大为4GBPL/SQL语言基础语言基础l注释l变量声明l运算符lPL/SQL块结构l控制语句PL/SQL 程序设计简介程序设计简介lPL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。SQL与PL/SQLlPL/SQL是ProcedureLanguage&StructuredQueryLanguage的缩写。ORACLE的SQL是支持ANSI(AmericannationalStandardsInstitute)和ISO92(InternationalStandardsOrganization)标准的产品。PL/SQL是对SQL语言存储过程语言的扩展。为什么使用PL/SQLl有利于客户/服务器环境应用的运行l适合于客户环境PL/SQL块结构块结构lPL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。DECLARE/*声明部分:在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数*/BEGIN/*执行部分:过程及SQL语句,即程序的主要部分*/EXCEPTION/*执行异常部分:错误处理*/END;PL/SQL块可以分为三类 l无名块:动态构造,只能执行一次。l子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。l触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。标识符lPL/SQL程序设计中的标识符定义与SQL的标识符定义的要求相同。要求和限制有:l标识符名不能超过30字符;l第一个字符必须为字母;l不分大小写;l不能用-(减号);l不能是SQL保留字。实例实例l下面的例子将会删除所有的纪录,而不是KING的记录。DECLAREv_enamevarchar2(20):=KING;BEGINDELETEFROMempWHEREename=v_ename;END;如何运行如何运行PL/SQL块结构?块结构?如何运行如何运行PL/SQL块结构?块结构?建议的命名方法建议的命名方法PL/SQL变量类型实例l插入一条记录并显示DECLARERow_idROWID;infoVARCHAR2(40);BEGININSERTINTOdeptVALUES(90,SERVICE,BEIJING)RETURNINGrowid,dname|:|to_char(deptno)|:|locINTOrow_id,info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL变量类型实例l其中,RETURNING子句用于检索INSERT语句中所影响的数据行数,当INSERT语句使用VALUES子句插入数据时,RETURNING子句还可将列表达式、ROWID和REF值返回到输出变量中。在使用RETURNING子句是应注意以下几点限制:l不能并行DML语句;l不能检索LONG类型信息;l当通过视图向基表中插入数据时,只能与单基表视图一起使用。PL/SQL变量类型实例l修改一条记录并显示DECLARERow_idROWID;infoVARCHAR2(40);BEGINUPDATEdeptSETdeptno=80WHEREDNAME=SERVICERETURNINGrowid,dname|:|to_char(deptno)|:|locINTOrow_id,info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL变量类型实例l其中,RETURNING子句用于检索被修改行信息,当UPDATE语句修改单行数据时,RETURNING子句可以检索被修改行的ROWID值,以及行中被修改列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据时,RETURNING子句可以将被修改行的ROWID值,以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING子句的限制与INSERT语句中对RETURNING子句的限制相同。PL/SQL变量类型实例l删除一条记录并显示DECLARERow_idROWID;infoVARCHAR2(40);BEGINDELETEdeptWHEREDNAME=SERVICERETURNINGrowid,dname|:|to_char(deptno)|:|locINTOrow_id,info;DBMS_OUTPUT.PUT_LINE(ROWID:|row_id);DBMS_OUTPUT.PUT_LINE(info);END;PL/SQL变量类型实例lRETURNING子句用于检索被删除行信息,当DELETE语句修改单行数据时,RETURNING子句可以检索被删除行的ROWID,以及被删除行中列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据时,RETURNING子句可以将被修改行的ROWID,以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING子句的限制与INSERT语句中对RETURNING子句的限制相同。复合类型复合类型lORACLE在PL/SQL中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型-记录和表。l记录类型l使用%TYPEl使用%ROWTYPE记录类型记录类型l记录类型是把逻辑相关的数据作为一个单元存储起来,它必须包括至少一个标量型(数字型、字符型、布尔型、日期型)或RECORD数据类型的成员,称作PL/SQLRECORD的域(FIELD),其作用是存放互不相同但逻辑相关的信息。定义记录类型语法如下:TYPErecord_typeISRECORD(Field1type1NOTNULL:=exp1,Field2type2NOTNULL:=exp2,.FieldntypenNOTNULL:=expn);实例实例DECLARETYPEtest_recISRECORD(CodeVARCHAR2(10),NameVARCHAR2(30)NOTNULL:=abook);V_booktest_rec;BEGINV_book.code:=123;V_book.name:=C+Programming;DBMS_OUTPUT.PUT_LINE(v_book.code|v_book.name);END;使用使用%TYPEl定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。l使用%TYPE特性的优点在于:l所引用的数据库列的数据类型可以不必知道;l所引用的数据库列的数据类型可以实时改变。实例实例 1DECLARE-用%TYPE类型定义与表相配的字段TYPEt_RecordISRECORD(T_noemp.empno%TYPE,T_nameemp.ename%TYPE,T_salemp.sal%TYPE);-声明接收数据的变量v_empt_Record;BEGINSELECTempno,ename,salINTOv_empFROMempWHEREempno=7788;DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp.t_no)|v_emp.t_name|TO_CHAR(v_emp.t_sal);END;实例实例 2DECLAREv_empnoemp.empno%TYPE:=&no;Typer_recordisrecord(v_nameemp.ename%TYPE,v_salemp.sal%TYPE,v_dateemp.hiredate%TYPE);Recr_record;BEGINSELECTename,sal,hiredateINTORecFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE(Rec.v_name|-|Rec.v_sal|-|Rec.v_date);END;使用使用%ROWTYPElPL/SQL提供%ROWTYPE操作符,返回一个记录类型,其数据类型和数据库表的数据结构相一致。l使用%ROWTYPE特性的优点在于:l所引用的数据库中列的个数和数据类型可以不必知道;l所引用的数据库中列的个数和数据类型可以实时改变。实例实例DECLAREv_empnoemp.empno%TYPE:=&no;recemp%ROWTYPE;BEGINSELECT*INTOrecFROMempWHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE(姓名:|rec.ename|工资:|rec.sal|工作时间:|rec.hiredate);END;运算符和表达式l算术运算符运算符和表达式l关系运算符运算符和表达式l逻辑运算符变量赋值l在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下:lvariable是一个PL/SQL变量,expression是一个PL/SQL表达式。variable:=expression;字符及数字运算特点字符及数字运算特点 l空值加数字仍是空值:NULL+=NULLl空值加(连接)字符,结果为字符:NULL|=BOOLEAN 赋值赋值 l布尔值只有TRUE,FALSE及NULL三个值。如:DECLAREdoneBOOLEAN;/*thefollowingstatementsarelegal:*/BEGINdone:=FALSE;WHILENOTdoneLOOPNull;ENDLOOP;END;游标赋值游标赋值 l游标赋值是通过SELECT语句来完成的,每次执行SELECT语句就赋值一次,一般要求被赋值的变量与SELECT中的列名要一一对应。游标赋值游标赋值 DECLAREemp_idemp.empno%TYPE:=7788;emp_nameemp.ename%TYPE;wagesemp.sal%TYPE;BEGINSELECTename,NVL(sal,0)+NVL(comm,0)INTOemp_name,wagesFROMempWHEREempno=emp_id;DBMS_OUTPUT.PUT_LINE(emp_name|-|to_char(wages);END;结果:SCOTT-3000可转换的类型赋值可转换的类型赋值 lCHAR 转换为转换为 NUMBER:l使用TO_NUMBER函数来完成字符到数字的转换,如:lv_total:=TO_NUMBER(100.0)+sal;lNUMBER 转换为转换为CHAR:l使用TO_CHAR函数可以实现数字到字符的转换,如:lv_comm:=TO_CHAR(123.45)|元;l字符转换为日期:字符转换为日期:l使用TO_DATE函数可以实现字符到日期的转换,如:lv_date:=TO_DATE(2001.07.03,yyyy.mm.dd);l日期转换为字符:日期转换为字符:l使用TO_CHAR函数可以实现日期到字符的转换,如:lv_to_day:=TO_CHAR(SYSDATE,yyyy.mm.ddhh24:mi:ss);变量作用范围及可见性变量作用范围及可见性 lPL/SQL的变量作用范围特点是:l变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束。l一个变量(标识)只能在你所引用的块内是可见的。l当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量的空间(因为它可能不用了)。l在子块中重新定义该变量后,它的作用仅在该块内。实例实例 DECLAREEmesschar(80);BEGINDECLAREV1NUMBER(4);BEGINSELECTempnoINTOv1FROMempWHERELOWER(job)=president;DBMS_OUTPUT.PUT_LINE(V1);EXCEPTIONWhenTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(Morethanonepresident);END;实例实例 续续DECLAREV1NUMBER(4);BEGINSELECTempnoINTOv1FROMempWHERELOWER(job)=manager;EXCEPTIONWhenTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(Morethanonemanager);END;EXCEPTIONWhenothersTHENEmess:=substr(SQLERRM,1,80);DBMS_OUTPUT.PUT_LINE(emess);END;注释注释 在PL/SQL里,可以使用两种符号来写注释,即:l使用双-(减号)加注释V_SalNUMBER(12,2);-工资变量。l使用/*/来加一行或多行注释/*/*文件名:department_salary.sql*/*/示例简单数据插入例子 DECLAREv_enameVARCHAR2(20):=Bill;v_salNUMBER(7,2):=1234.56;v_deptnoNUMBER(2):=10;v_empnoNUMBER(4):=8888;BEGININSERTINTOemp(empno,ename,JOB,sal,deptno,hiredate)VALUES(v_empno,v_ename,Manager,v_sal,v_deptno,TO_DATE(1954.06.09,yyyy.mm.dd);COMMIT;END;示例简单数据删除例子 DECLAREv_empnonumber(4):=8888;BEGINDELETEFROMempWHEREempno=v_empno;COMMIT;END;PL/SQL流程控制语句流程控制语句 lPL/SQL的流程控制语句包括如下三类:l控制语句:IF语句;l循环语句:LOOP语句,EXIT语句;l顺序语句:GOTO语句,NULL语句。条件语句IFTHENPL/SQL和SQL语句ENDIF;IFTHENPL/SQL和SQL语句ELSE其它语句ENDIF;条件语句IFTHENPL/SQL和SQL语句ELSIFTHEN其它语句ELSIFTHEN其它语句ELSE其它语句ENDIF;条件语句实例DECLAREv_empnoemp.empno%TYPE:=&empno;V_salaryemp.sal%TYPE;V_commentVARCHAR2(35);BEGINSELECTsalINTOv_salaryFROMempWHEREempno=v_empno;IFv_salary1500THENV_comment:=Fairlyless;ELSIFv_salary3000THENV_comment:=Alittlemore;ELSEV_comment:=Lotsofsalary;ENDIF;DBMS_OUTPUT.PUT_LINE(V_comment);END;CASE表达式CASEselectorWHENexpression1THENresult1WHENexpression2THENresult2WHENexpressionNTHENresultNELSEresultN+1END;CASE表达式实例DECLAREV_gradechar(1):=UPPER(&p_grade);V_appraisalVARCHAR2(20);BEGINV_appraisal:=CASEv_gradeWHENATHENExcellentWHENBTHENVeryGoodWHENCTHENGoodELSENosuchgradeEND;DBMS_OUTPUT.PUT_LINE(Grade:|v_grade|Appraisal:|v_appraisal);END;CASE表达式实例代码运行结果:Entervalueforp_grade:Aold2:V_gradechar(1):=UPPER(&p_grade);new2:V_gradechar(1):=UPPER(A);Grade:AAppraisal:Excellent循环l简单循环简单循环LOOP要执行的语句;EXITWHEN/*条件满足,退出循环语句*/ENDLOOP;LOOP循环循环 实例实例DECLAREintNUMBER(2):=0;BEGINLOOPint:=int+1;DBMS_OUTPUT.PUT_LINE(int的当前值为:|int);EXITWHENint=10;ENDLOOP;END;循环lWHILE 循环循环WHILELOOP要执行的语句;ENDLOOP;WHILE循环循环 实例实例DECLARExNUMBER:=1;BEGINWHILEx=10LOOPDBMS_OUTPUT.PUT_LINE(X的当前值为:|x);x:=x+1;ENDLOOP;END;循环循环 l数字式循环l每循环一次,循环变量自动加1,使用关键字REVERSE,循环变量自动减1。跟在INREVERSE后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT退出循环。FOR循环计数器INREVERSE下限.上限LOOP要执行的语句;ENDLOOP;数字式循环数字式循环 实例实例BEGINFORintin1.10LOOPDBMS_OUTPUT.PUT_LINE(int的当前值为:|int);ENDLOOP;END;数字式循环数字式循环 实例实例CREATETABLEtemp_table(num_colNUMBER);DECLAREV_counterNUMBER:=10;BEGININSERTINTOtemp_table(num_col)VALUES(v_counter);FORv_counterIN20.25LOOPINSERTINTOtemp_table(num_col)VALUES(v_counter);ENDLOOP;INSERTINTOtemp_table(num_col)VALUES(v_counter);FORv_counterINREVERSE20.25LOOPINSERTINTOtemp_table(num_col)VALUES(v_counter);ENDLOOP;END;DROPTABLEtemp_table;GOTO和标签ll标号是用括起来的标识符GOTOlabel;GOTO和标签实例DECLAREV_counterNUMBER:=1;BEGINLOOPDBMS_OUTPUT.PUT_LINE(V_counter的当前值为:|V_counter);V_counter:=v_counter+1;IFv_counter10THENGOTOl_ENDofLOOP;ENDIF;ENDLOOP;DBMS_OUTPUT.PUT_LINE(V_counter的当前值为:|V_counter);END;NULL语句DECLARE.BEGINIFv_numISNULLTHENGOTOprint1;ENDIF;NULL;-不需要处理任何数据。END;游标概念l为了处理SQL语句获取一个表中记录,ORACLE提供一个上下文,它提供了一个指向语句的指针以及查询的活动集(activeset)。游标是一个指向上下文的句柄(handle)或指针。通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。游标概念l对于不同的SQL语句,游标的使用情况不同:处理显式游标处理显式游标l显式游标处理需四个PL/SQL步骤:l定义游标格式:CURSORcursor_nameISselect_statement;l打开游标格式:OPENcursor_name;l提取游标数据格式:FETCHcursor_nameINTOvariable_list|record_variable;l关闭游标格式:CLOSEcursor_name;示例1 DECLARECURSORc_cursorISSELECTename,salFROMempWHERErownum11;v_enameemp.ename%TYPE;v_salemp.sal%TYPE;BEGINOPENc_cursor;FETCHc_cursorINTOv_ename,v_sal;WHILEc_cursor%FOUNDLOOPDBMS_OUTPUT.PUT_LINE(v_ename|-|to_char(v_sal);FETCHc_cursorINTOv_ename,v_sal;ENDLOOP;CLOSEc_cursor;END;示例2 DECLAREDeptRecdept%ROWTYPE;Dept_namedept.dname%TYPE;Dept_locdept.loc%TYPE;CURSORc1ISSELECTdname,locFROMdeptWHEREdeptno=30;CURSORc2(dept_noNUMBERDEFAULT10)ISSELECTdname,locFROMdeptWHEREdeptno=dept_no;CURSORc3(dept_noNUMBERDEFAULT10)ISSELECT*FROMdeptWHEREdeptno20);LOOPFETCHc3INTOdeptrec;EXITWHENc3%NOTFOUND;DBMS_OUTPUT.PUT_LINE(deptrec.deptno|-|deptrec.dname|-|deptrec.loc);ENDLOOP;CLOSEc3;END;游标属性游标属性 l%FOUND布尔型属性,当最近一次读记录时成功返回,则值为TRUE;l%NOTFOUND布尔型属性,与%FOUND相反;l%ISOPEN布尔型属性,当游标已打开时返回TRUE;l%ROWCOUNT数字型属性,返回已从游标中读取的记录数。示例DECLAREv_empnoemp.empno%TYPE;v_salemp.sal%TYPE;CURSORc_cursorISSELECTempno,salFROMemp;BEGINOPENc_cursor;LOOPFETCHc_cursorINTOv_empno,v_sal;EXITWHENc_cursor%NOTFOUND;IFv_sal=1200THENUPDATEempSETsal=sal+50WHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE(编码为|v_empno|工资已更新!);ENDIF;DBMS_OUTPUT.PUT_LINE(记录数:|c_cursor%ROWCOUNT);ENDLOOP;CLOSEc_cursor;END;游标的FOR循环 FORindex_variableINcursor_namevalue,valueLOOP-游标数据处理代码ENDLOOP;游标中使用游标中使用FOR循环示例循环示例 DECLARECURSORc_salISSELECTempno,ename,salFROMemp;BEGIN-隐含打开游标FORv_salINc_salLOOP-隐含执行一个FETCH语句DBMS_OUTPUT.PUT_LINE(to_char(v_sal.empno)|-|v_sal.ename|-|to_char(v_sal.sal);-隐含监测c_sal%NOTFOUNDENDLOOP;-隐含关闭游标END;有参数游标中使用有参数游标中使用FOR循环示例循环示例 DECLARECURSORc_cursor(dept_noNUMBERDEFAULT10)ISSELECTdname,locFROMdeptWHEREdeptno30)DBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc);ENDLOOP;DBMS_OUTPUT.PUT_LINE(CHR(10)|使用默认的dept_no参数值10:);FORc1_recINc_cursorLOOPDBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc);ENDLOOP;END;游标游标FOR循环语句中使用子查询来实循环语句中使用子查询来实现游标现游标 实例实例BEGINFORc1_recIN(SELECTdname,locFROMdept)LOOPDBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc);ENDLOOP;END;处理隐式游标l当查询返回结果超过一行时,就需要一个显式游标。显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL语句所包含的数据。处理隐式游标处理隐式游标格式调用为:SQL%当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。处理隐式游标处理隐式游标隐 式 游 标 只 使 用 SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT三个属性,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;SELECTINTO至少返回一行为TRUE;SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。处理隐式游标处理隐式游标 示例示例DECLAREV_deptnoemp.deptno%TYPE:=&p_deptno;BEGINDELETEFROMempWHEREdeptno=v_deptno;IFSQL%NOTFOUNDTHENDELETEFROMdeptWHEREdeptno=v_deptno;ENDIF;END;异常错误处理l异常情况处理是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行。有三种类型的异常:有三种类型的异常:l预定义预定义(Predefined)异常异常lORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。l非预定义非预定义(Predefined)异常异常l即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。l用户定义用户定义(User_define)异常异常l程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。异常处理部分结构异常处理部分结构 EXCEPTIONWHENfirst_exceptionTHENWHENsecond_exceptionTHENWHENOTHERSTHENEND;预定义的异常处理实例实例DECLAREv_empnoemp.empno%TYPE:=&empno;v_salemp.sal%TYPE;BEGINSELECTsalINTOv_salFROMempWHEREempno=v_empno;IFv_sal=1500THENUPDATEempSETsal=sal+100WHEREempno=v_empno;DBMS_OUTPUT.PUT_LINE(编码为|v_empno|员工工资已更新!);ELSEDBMS_OUTPUT.PUT_LINE(编码为|v_empno|员工工资已经超过规定值!);ENDIF;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE(数据库中没有编码为|v_empno|的员工);WHENTOO_MANY_ROWSTHENDBMS_OUTPUT.PUT_LINE(程序运行错误!请使用游标);WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END;非预定义的异常处理l非定义的ORACLE错误进行定义,步骤如下:l1.在PL/SQL块的定义部分定义异常情况:lEXCEPTION;l2.将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:lPRAGMAEXCEPTION_INIT(,);l3.在PL/SQL块的异常情况处理部分对异常情况做出相应的处理。示例示例INSERTINTOdeptVALUES(50,FINANCE,CHICAGO);DECLAREv_deptnodept.deptno%TYPE:=&deptno;deptno_remainingEXCEPTION;PRAGMAEXCEPTION_INIT(deptno_remaining,-2292);/*-2292是违反一致性约束的错误代码*/BEGINDELETEFROMdeptWHEREdeptno=v_deptno;EXCEPTIONWHENdeptno_remainingTHENDBMS_OUTPUT.PUT_LINE(违反数据完整性约束!);WHENOTHERSTHENDBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM);END;存储函数和过程存储函数和过程lORACLE提供可以把PL/SQL程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。在本节中主要介绍:l创建存储过程和函数;l建立和管理存储过程和函数。创建函数创建函数 l语法如下:CREATEorREPLACEFUNCTIONfunction_name(argmentin|inoutTYPE,argmentin|out|inouttypeRETURNRETURN_typeIS|ASBEGINFUNCTION_bodyEXCEPTION.ENDfunction_name;创建函数创建函数 示例示例CREATEORREPLACEFUNCTIONget_salary(Dept_noNUMBER,Emp_countOUTNUMBER)RETURNNUMBERISV_sumNUMBER;BEGINSELECTSUM(sal),count(*)INTOV_sum,emp_countFROMempWHEREdeptno=dept_no;RETURNv_sum;EXCEPTIONWHENNO_DATA_FOUNDTHENDBMS_OUTPUT.PUT_LINE(你需要的数据不存在!);WHENOTHERSTHENDBMS