oracle10数据库基础教程课件第14章语言基础_第1页
oracle10数据库基础教程课件第14章语言基础_第2页
oracle10数据库基础教程课件第14章语言基础_第3页
oracle10数据库基础教程课件第14章语言基础_第4页
oracle10数据库基础教程课件第14章语言基础_第5页
已阅读5页,还剩157页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Oracle10g 数据库基础教程1第第14章章 PL/SQL语言基础语言基础Oracle10g 数据库基础教程2本章内容本章内容pPL/SQL概述pPL/SQL基础p控制结构p游标p异常处理Oracle10g 数据库基础教程3本章要求本章要求p掌握PL/SQL程序基本结构p掌握PL/SQL程序控制结构p掌握PL/SQL程序游标应用p掌握PL/SQL程序异常处理机制Oracle10g 数据库基础教程414.1 PL/SQL概述概述pPL/SQL特点pPL/SQL功能特性pPL/SQL执行过程与开发工具Oracle10g 数据库基础教程514.1.1 PL/SQL特点特点p与SQL语言紧密集成。

2、p减小网络流量,提高应用程序的运行性能。p模块化的程序设计功能,提高了系统可靠性。p服务器端程序设计,可移植性好。Oracle10g 数据库基础教程614.1.2 PL/SQL功能特性功能特性p语句块结构p异常处理p变量和类型p条件语句p循环结构p游标p过程、函数和触发器p包p集合p动态SQLp批绑定p对象特性Oracle10g 数据库基础教程714.1.3 PL/SQL执行过程与开发工具执行过程与开发工具PL/SQL块SQL语句客户端应用程序PL/SQL引擎数据库服务器过程化语句执行器SQL执行器块中SQL语句pPL/SQL执行过程 Oracle10g 数据库基础教程8pPL/SQL开发工具

3、pSQL *PLUSpProcedure BuilderpOracle Form、Oracle ReportspPL/SQL DeveloperOracle10g 数据库基础教程914.2 PL/SQL基础基础pPL/SQL程序结构 p词法单元 p数据类型p变量与常量pPL/SQL记录 p编译指示pPL/SQL中的SQL语句Oracle10g 数据库基础教程1014.2.1 PL/SQL程序结构程序结构pPL/SQL块的组成pPL/SQL块分类 Oracle10g 数据库基础教程11(1)PL/SQL块的组成块的组成pPL/SQL程序的基本单元是语句块,所有的PL/SQL程序都是由语句块构成的

4、 。p一个完整的PL/SQL语句块由3个部分组成。 DECLARE 声明部分,定义变量、数据类型、异常、局部子程序等 BEGIN 执行部分,实现块的功能 EXCEPTION 异常处理部分,处理程序执行过程中产生的异常 END; Oracle10g 数据库基础教程12p声明部分p主要用于声明变量、常量、数据类型、游标、异常处理名称以及本地(局部)子程序定义等。 p可执行部分p执行部分是PL/SQL块的功能实现部分。该部分通过变量赋值、流程控制、数据查询、数据操纵、数据定义、事务控制、游标处理等实现块的功能。p异常处理部分p异常处理部分用于处理该块执行过程中产生的异常。 Oracle10g 数据库

5、基础教程13p注意:p执行部分是必须的,而声明部分和异常部分是可选的p可以在一个块的执行部分或异常处理部分嵌套其他的PL/SQL块;p所有的PL/SQL块都是以“END;”结束。Oracle10g 数据库基础教程14pDECLAREp v_ename VARCHAR2(10);pBEGINp SELECT ename INTO v_ename FROM emp p WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_ename);pEXCEPTIONp WHEN NO_DATA_FOUND THENp DBMS_OUTPUT.PUT_LINE(There is

6、not such a employee);pEND;Oracle10g 数据库基础教程15pDECLAREp v_sal NUMBER(6,2);p v_deptno NUMBER(2);pBEGIN p BEGINp SELECT deptno INTO v_deptno FROM emp p WHERE empno=7844;p END;p SELECT avg(sal) INTO v_sal FROM emp p WHERE deptno=v_deptno;p DBMS_OUTPUT.PUT_LINE(v_sal);pEND;Oracle10g 数据库基础教程16p注意p若要在SQL*P

7、lus环境中看到DBMS_OUTPUT.PUT_LINE方法的输出结果,必须将环境变量SERVEROUTPUT设置为ON。pSET SERVEROUTPUT ONOracle10g 数据库基础教程17(2)PL/SQL块分类块分类p匿名块p匿名块是指动态生成,只能执行一次的块,不能由其他应用程序调用。p命名块p命名块是指一次编译可多次执行的PL/SQL程序,包括函数、存储过程、包、触发器等。它们编译后放在服务器中,由应用程序或系统在特定条件下调用执行。 Oracle10g 数据库基础教程18p命名块示例pCREATE OR REPLACE PROCEDURE showavgsal p(p_de

8、ptno NUMBER)pASp v_sal NUMBER(6,2);pBEGINp SELECT avg(sal) INTO v_sal FROM emp p WHERE deptno=p_deptno;p DBMS_OUTPUT.PUT_LINE(v_sal);pEND showavgsal;Oracle10g 数据库基础教程1914.2.2 词法单元词法单元p字符集p标识符p分隔符p常量值p注释Oracle10g 数据库基础教程20(1)字符集)字符集pPL/SQL的字符集包括:p大小写字母:AZ,azp数字:09p空白:制表符、空格和回车p数字符号:+ - * / =p标点符号: !

9、# $ % &* ()_ | ? ; :, . “ p注意pPL/SQL字符集不区分大小写。Oracle10g 数据库基础教程21(2)标识符)标识符p标识符用于定义PL/SQL变量、常量、异常、游标名称、游标变量、参数、子程序名称和其他的程序单元名称等。p在PL/SQL程序中,标识符是以字母开头的,后边可以跟字母、数字、美元符号($)、井号(#)或下划线(_),其最大长度为30个字符,并且所有字符都是有效的。p例如,X,v_empno,v_$等都是有效的标识符,而X+y,_temp则是非法的标识符。p注意p如果标识符区分大小写、使用预留关键字或包含空格等特殊符号,则需要用“”括起来,

10、称为引证标识符。例如标识符“my book”和“exception”。Oracle10g 数据库基础教程22(3)分隔符)分隔符p+p-p*p/p=p:=pp=pp!=p=p=p(p)p/*p*/pp%p;p:p.pp“p.pp|p=p*p-p分隔符是指有特定含义的单个符号或组合符号 Oracle10g 数据库基础教程23(4)常量值)常量值p字符型文字p以单引号引起来的字符串,在字符串中的字符区分大小写。如果字符串中本身包含单引号,则用两个连续的单引号进行转义。p数字型文字p分为整数与实数两类。其中,整数没有小数点,如123;而实数有小数点,如123.45。可以用科学计数法表示数字型文字,如

11、123.45可以表示为1.2345E2。p布尔型文字p预定义的布尔型变量的取值,包括TRUE,FALSE,NULL三个值。p日期型文字p表示日期值,其格式随日期类型格式不同而不同。Oracle10g 数据库基础教程24(5)注释)注释p单行注释p-p多行注释p以 “/*”开始,以“*/”结束。pDECLAREp v_department CHAR(10); p - variable to hold the department name p BEGIN p /* query the department name which p department number is 10 ouput th

12、e department p name into v_department*/p SELECT dname INTO v_department FROM dept p WHERE deptno=10;p END; Oracle10g 数据库基础教程2514.2.3 数据类型数据类型p数字类型p字符类型p日期/区间类型p行标识类型p布尔类型p原始类型pLOB类型p引用类型 p记录类型p集合类型p%TYPE与%ROWTYPEOracle10g 数据库基础教程26PL/SQL中常用的基本数据类型分类数据类型数字类型NUMBER、BINARY_NUMBER PLS_NUMBER字符类型VARCHAR2

13、、CHAR、LONG、NCHAR、NVARCHAR日期/区间类型 DATE、TIMESTAMP、INTERVAL行标识类型ROWID、UROWID布尔类型BOOLEAN(TRUE、FALSE、NULL)原始类型RAW、LONG RAWLOB类型CLOB、BLOB、NCLOB、BFILE引用类型 REF CURSOR,REF object_type。 记录类型RECORD集合类型TABLE、VARRAYOracle10g 数据库基础教程27p数字类型 pNUMBER类型以十进制形式存储整数和浮点数,语法为NUMBER(p,s)。其中,p为精度,即所有有效数字位数;s为刻度范围,即小数位数。p的取

14、值范围为138。pBINARY_INTEGER类型用于表示从-2147483647 7之间的整数,以二进制形式存储。当发生溢出时,将自动转换成NUMBER类型。pPLS_INTEGER类型表示范围与BINARY_INTEGER相同,但发生溢出时会产生错误。Oracle10g 数据库基础教程28p字符类型 pPL/SQL中的字符类型与Oracle数据库中的字符类型类似,但是允许字符串的长度有所不同。pVARCHAR2,CHAR主要用于存储来自本地数据库字符集的字符,而NCHAR,NVARCHAR2 用于存储来自国家字符集的字符串。 类 型PL/SQL中最大字节数Oracle中最大字节数VARCH

15、AR2327674000NVARCHAR2327674000CHAR327672000NCHAR327672000LONG327602GBOracle10g 数据库基础教程29p日期/区间类型 pDATE:与数据库中的DATE类型相同,存储日期和时间信息,包括世纪、年、月、日、小时、分和秒,不包括秒的小数部分。pTIMESTAMP:与DATE类型相似,但包括秒的小数部分,有以下3种形式。pTIMESTAMP(p):其中p为秒字段的小数部分精度。pTIMESTAMP(p)WITH TIME ZONE:返回当前时区的时间戳。pTIMESTAMP(p)WITH LOACL TIME ZONE:返回数

16、据库时区的时间戳。Oracle10g 数据库基础教程30nINTERVAL:用于存储两个时间戳之间的时间间隔,:用于存储两个时间戳之间的时间间隔,有下面两种形式。有下面两种形式。nINTERVAL YEAR (p)TO MONTH:两个时间:两个时间戳相差的年数和月数。戳相差的年数和月数。nINTERVAL DAY(dp) TO SECOND(sp):两个时间戳相差的天数和秒数。两个时间戳相差的天数和秒数。Oracle10g 数据库基础教程31p行标识类型pROWID表示行的物理地址pUROWID既可以表示行的物理地址,也可以表示行的逻辑地址。p布尔类型(BOOLEAN)p只能在PL/SQL中

17、使用,其取值为逻辑值,包括TRUE、FALSE、NULL。p原始类型p与Oracle数据库中的原始类型相似,但子节数不同。 类 型PL/SQL中最大字节数Oracle中最大字节数RAW327672000LONG RAW327672GOracle10g 数据库基础教程32pLOB类型p包括BLOB,CLOB,NCLOB和BFILE四种类型。其中BLOB存放二进制数据,CLOB,NCLOB存放文本数据,而BFILE存放指向操作系统文件的指针。pLOB类型变量可以存储4 GB的数据量。p引用类型p引用类型类似于其他高级语言中的指针类型。在PL/SQL中,引用类型包括游标的引用类型和对象的引用类型,即

18、REF CURSOR和REF object_type。Oracle10g 数据库基础教程33p记录类型p记录类型是复合类型,类似于C语言中的结构体,是一个包含若干个成员分量的复合类型。p在使用记录类型时,需要先在声明部分定义记录类型和记录类型的变量,然后在执行部分引用该记录类型变量或其成员分量。p集合类型p集合类型是复合类型,包括索引表类型、嵌套表类型和可变数组类型。p集合类型与记录类型的区别在于,记录类型中的成员分量可以是不同类型的,类似于结构体,而集合类型中所有的成员分量必须具有相同的数据类型,类似于数组。 Oracle10g 数据库基础教程34p%TYPE与%ROWTYPEp如果要定义一

19、个类型与某个变量的数据类型或数据库表中某个列的数据类型一致(不知道该变量或列的数据类型)的变量,可以利用%TYPE来实现。p如果要定义一个与数据库中某个表结构一致的记录类型的变量,可以使用%ROWTYPE来实现。 p注意p变量的类型随参照的变量类型、数据库表列类型、表结构的变化而变化;p 如果数据库表列中有NOT NULL约束,则%TYPE与%ROWTYPE返回的数据类型没有此限制。 Oracle10g 数据库基础教程35pDECLAREp v_sal emp.sal%TYPE;p v_emp emp%ROWTYPE;pBEGINp SELECT sal INTO v_sal FROM emp

20、 WHERE empno=7844;p SELECT * INTO v_emp FROM emp WHERE empno=7900;p DBMS_OUTPUT.PUT_LINE(v_sal);p DBMS_OUTPUT.PUT_LINE(v_emp.ename|v_emp.sal);pEND; Oracle10g 数据库基础教程3614.2.4 变量与常量变量与常量p变量与常量的定义p变量的作用域Oracle10g 数据库基础教程37变量声明(1)变量与常量的定义)变量与常量的定义p变量定义的一般格式pvariable_name CONSTANT datatype NOT NULL DEFAU

21、LT|:=expression;p说明p变量或常量名称是一个PL/SQL标识符,应符合标识符命名规范;p每行只能定义一个变量;p如果加上关键字CONSTANT,则表示所定义的是一个常量,必须为它赋初值;p如果定义变量时使用了NOT NULL关键字,则必须为变量赋初值;p如果变量没有赋初值,则默认为NULL;p使用DEFAULT或“:=”运算符为变量初始化。Oracle10g 数据库基础教程38pDECLAREp v1 NUMBER(4);p v2 NUMBER(4) NOT NULL :=10;p v3 CONSTANT NUMBER(4) DEFAULT 100;pBEGINp IF v1

22、IS NULL THEN p DBMS_OUTPUT.PUT_LINE(V1 IS NULL! );p END IF;p DBMS_OUTPUT.PUT_LINE(v2| |v3);pEND;Oracle10g 数据库基础教程39(2)变量的作用域)变量的作用域p变量的作用域是指变量的有效作用范围,从变量声明开始,直到块结束。p如果PL/SQL块相互嵌套,则在内部块中声明的变量是局部的,只能在内部块中引用,而在外部块中声明的变量是全局的,既可以在外部块中引用,也可以在内部块中引用。p如果内部块与外部块中定义了同名变量,则在内部块中引用外部块的全局变量时需要使用外部块名进行标识。 Oracle1

23、0g 数据库基础教程40ppDECLAREp v_ename CHAR(16);p v_outer NUMBER(5);pBEGINp v_outer :=10;p DECLAREp v_ename CHAR(20); p v_inner DATE;p BEGINp v_inner:=sysdate;p v_ename:=INNER V_ENAME;p OUTER.v_ename:=OUTER V_ENAME;p END;p DBMS_OUTPUT.PUT_LINE(v_ename);pEND; Oracle10g 数据库基础教程4114.2.5 PL/SQL记录记录 p用户定义记录类型及变量

24、 p利用%ROWTYPE获取记录类型定义变量 p记录类型变量的应用 p在SELECT语句中使用记录类型变量 p在INSERT语句中使用记录类型变量 p在UPDATE语句中使用记录类型变量 p在DELETE语句中使用记录类型变量 Oracle10g 数据库基础教程42(1)用户定义记录类型及变量)用户定义记录类型及变量 p定义记录类型的语法为pTYPE record_type IS RECORD(pfield1 datatype1 NOT NULLDEFAULT|:=expr1,pfield2 datatype2 NOT NULL DEFAULT|:=expr2,ppfieldn datatyp

25、en NOT NULL DEFAULT|:=exprn);p注意:p相同记录类型的变量可以相互赋值;p不同记录类型的变量,即使成员完全相同也不能相互赋值;p记录类型只能应用于定义该记录类型的PL/SQL块中,即记录类型是局部的。Oracle10g 数据库基础教程43p利用记录类型以及记录类型变量,保存员工信息。 pDECLAREp TYPE t_emp IS RECORD(p empno NUMBER(4), p ename CHAR(10),p sal NUMBER(6,2);p v_emp t_emp;pBEGINp SELECT empno,ename,sal INTO v_emp p

26、FROM emp WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_emp.ename| |v_emp.sal);pEND;Oracle10g 数据库基础教程44(2)利用)利用%ROWTYPE获取记录类型获取记录类型定义变量定义变量pDECLAREp v_emp1 emp%ROWTYPE;p v_emp2 emp%ROWTYPE;p CURSOR c_emp IS SELECT empno,ename FROM emp p WHERE deptno=10;p v_emp10 c_emp%ROWTYPE; pBEGINp SELECT * INTO v_emp

27、1 FROM emp WHERE empno=7844;p OPEN c_emp; p LOOPp FETCH c_emp INTO v_emp10;p EXIT WHEN c_emp%NOTFOUND;p DBMS_OUTPUT.PUT_LINE(v_emp10.empno| |p v_emp10.ename); p END LOOP; p CLOSE c_emp;pEND; Oracle10g 数据库基础教程45(3)记录类型变量的应用)记录类型变量的应用p在SELECT语句中使用记录类型变量 p在SELECT INTO 语句中使用记录类型变量pDECLAREp v_emp emp%ROW

28、TYPE; pBEGINp SELECT * INTO v_emp FROM empp WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_emp.empno| | p v_emp.ename| |v_emp.sal); pEND;p注意p记录类型变量中分量的个数、顺序、类型应该与查询列表中列的个数、顺序、类型完全匹配。 Oracle10g 数据库基础教程46p在SELECT语句中使用记录类型变量p在SELECT INTO 语句中使用记录类型变量成员pDECLAREp v_emp emp%ROWTYPE; pBEGINp SELECT empno,ename,s

29、al INTO v_emp.empno, p v_emp.ename,v_emp.sal FROM emp p WHERE empno=7844;p DBMS_OUTPUT.PUT_LINE(v_emp.empno|p v_emp.ename|v_emp.sal); pEND;Oracle10g 数据库基础教程47p在INSERT语句中使用记录类型变量p在VALUES子句中使用记录类型变量 pDECLAREp v_dept dept%ROWTYPE;pBEGINp v_dept.deptno:=50;p v_dept.loc:=BEIJING;p V_dept.dname:=COMPUTER;

30、p INSERT INTO DEPT VALUES v_dept;pEND;p注意p记录类型变量中分量的个数、顺序、类型应该与表中列的个数、顺序、类型完全匹配。 Oracle10g 数据库基础教程48p在INSERT语句中使用记录类型变量p在VALUES子句中使用记录类型变量成员 pDECLAREp v_emp emp%ROWTYPE;pBEGINp SELECT * INTO v_emp FROM emp p WHERE empno=7844; p INSERT INTO emp(empno,ename,mgr,sal) p VALUES(1234,TOM,v_emp.mgr,v_emp.

31、sal);pEND; Oracle10g 数据库基础教程49p在UPDATE语句中使用记录类型变量p在SET子句中使用记录类型变量(使用ROW关键字) pDECLAREp v_dept dept%ROWTYPE;pBEGINp v_dept.deptno:=50;p v_dept.loc:=TIANJIN;p V_dept.dname:=COMPUTER;p UPDATE dept SET ROW=v_dept WHERE deptno=50;pEND;p注意p记录类型变量中分量的个数、顺序、类型应该与表中列的个数、顺序、类型完全匹配。 Oracle10g 数据库基础教程50p在UPDATE语

32、句中使用记录类型变量p在SET子句中使用记录类型变量成员pDECLAREp v_emp emp%ROWTYPE;p BEGINp SELECT * INTO v_emp FROM emp p WHERE empno=7844;p UPDATE emp SET sal=v_emp.sal, comm=v_mp WHERE empno=7369;p END;Oracle10g 数据库基础教程51p在DELETE语句中使用记录类型变量pDECLAREp v_emp emp%ROWTYPE;p BEGINp SELECT * INTO v_emp FROM emp p WHERE empno=7844

33、;p DELETE FROM emp WHERE deptno=v_emp.deptno;p END; Oracle10g 数据库基础教程5214.2.6 编译指示编译指示p编译指示是对编译程序发出的特殊指令,也称为伪指令,不会改变程序含义。它只是向编译程序传递信息,类似于嵌入在SQL中的注释。p在PL/SQL中使用PRAGMA关键字通知编译程序,PL/SQL语句的剩余部分是一个编译指示或命令。编译指示在编译时被处理,而不会在运行时被执行,类似于C语言中的#define。Oracle10g 数据库基础教程53pPL/SQL提供以下4种编译指示pEXCEPTION_INIT:告诉编译程序将一个特

34、定的错误号与程序中所声明的异常标识符关联起来。pRESTRICT_REFERENCES:告诉编译程序打包程序的纯度,即对函数中可以使用的SQL语句和包变量进行限制。pSERIALLY_REUSEABLE:告诉PL/SQL运行引擎时,在数据引用之间不要保持包级数据。pAUTONOMOUS_TRANSACTION:告诉编译程序,该程序块为自治事务,即该事务的提交和回滚是独立进行的。Oracle10g 数据库基础教程5414.2.7 PL/SQL中中SQL语句语句p由于PL/SQL执行采用早期绑定,即在编译阶段对变量进行绑定,识别程序中标识符的位置,检查用户权限、数据库对象等信息,因此在PL/SQL

35、中只允许出现: pSELECT pDML(UPDATE、DELETE、INSERT)p事务控制语句(COMMIT、ROLLBACK、SAVEPOINT)p注意pDDL语句不可以直接使用Oracle10g 数据库基础教程55p通常,利用SQL语句对数据库进行操作时,各种相关量都在代码中以常量的形式指定,而在PL/SQL中可以通过变量动态指定各种相关量的值,从而实现对数据库的动态操作。pDECLARE p v_empno NUMBER(4);pBEGINp v_empno:=&x;p UPDATE emp SET sal=sal+100 WHERE empno=v_empno;pEND;

36、Oracle10g 数据库基础教程56pSELECT语句p在PL/SQL程序中,使用SELECTINTO语句查询一个记录的信息。p其语法为:pSELECT select_list_item INTO pvariable_list|record_variable pFROM tablepWHERE condition; Oracle10g 数据库基础教程57p根据员工名或员工号查询员工信息,程序为:pDECLAREp v_emp emp%ROWTYPE;p v_ename emp.ename%type;p v_sal emp.sal%type;pBEGINp SELECT * INTO v_em

37、p FROM emp p WHERE ename=SMITH;p DBMS_OUTPUT.PUT_LINE(v_emp.empno| |v_emp.sal);p SELECT ename,sal INTO v_ename,v_sal FROM emp p WHERE empno=7900;p DBMS_OUTPUT.PUT_LINE(v_ename| |v_sal);pEND; Oracle10g 数据库基础教程58p注意:pSELECTINTO语句只能查询一个记录的信息,如果没有查询到任何数据,会产生NO_DATA_FOUND异常;如果查询到多个记录,则会产生TOO_MANY_ROWS异常。

38、pINTO句子后的变量用于接收查询的结果,变量的个数、顺序应该与查询的目标数据相匹配,也可以是记录类型的变量。Oracle10g 数据库基础教程59p用SELECTINTO语句查询10号部门所有员工信息。pDECLAREp v_emp emp%ROWTYPE;p BEGINp SELECT * INTO v_emp FROM emp WHERE deptno=10;p END;p /p*pERROR 位于第 1 行:pORA-01422: 实际返回的行数超出请求的行数pORA-06512: 在line 4Oracle10g 数据库基础教程60pDML语句pPL/SQL中DML语句对标准SQL语

39、句中的DML语句进行了扩展,允许使用变量。pDECLAREp v_empno emp.empno%TYPE :=7500;pBEGINp INSERT INTO emp(empno,ename,sal,deptno) p VALUES(v_empno,JOAN,2300,20);p UPDATE emp SET sal=sal+100 p WHERE empno=v_empno;p DELETE FROM emp WHERE empno=v_empno;pEND; Oracle10g 数据库基础教程61pWHEREp标识符的区分p系统首先查看WHERE子句中的标识符是否与表中的列名相同,如果相

40、同,则该标识符被解释为列名;如果没有同名列,系统检查该标识符是不是PL/SQL语句块的变量。p字符串比较p填充比较:通过在短字符串后添加空格,使两个字符串达到相同长度,然后根据每个字符的ASCII码进行比较。p非填充比较:根据每个字符的ASCII码进行比较,最先结束的字符串为小。Oracle10g 数据库基础教程62p那么何时采用填充比较,何时采用非填充比较呢?pPL/SQL中规定,对定长的字符串(CHAR类型的字符串和字符串常量)采用填充比较;如果比较的字符串中有一个是变长字符串(VARCHAR2类型的字符串),则采用非填充比较。 Oracle10g 数据库基础教程63p例如,已知emp表中

41、ename列类型为VARCHAR2(10),执行下面的代码。pDECLAREp v_ename CHAR(10):=TURNER;p-v_ename VARCHAR2(20);p -v_ename emp.ename%TYPE:=TURNER;p v_sal emp.sal%TYPE;pBEGINp SELECT sal INTO v_sal FROM emp WHERE ename=v_ename;p dbms_output.put_line(v_sal);pEND;p /pDECLAREp*p第 1 行出现错误:pORA-01403: 未找到数据pORA-06512: 在 line 6 O

42、racle10g 数据库基础教程64p产生错误的原因是VARCHAR2(10)类型与CHAR(10)类型比较时采用非填充比较,因此无法查询到员工名为“TURNER”的员工。可以将v_ename变量类型修改为VARCHAR2(10)类型,也可以直接采用emp.ename%TYPE方式定义。p因此,为了保证程序的正确执行,一定要使PL/SQL语句块中的变量与要比较的数据库列拥有相同的数据类型,可以使用%TYPE或%ROWTYPE来定义变量。Oracle10g 数据库基础教程65pRETURNINGp如果要查询当前DML语句操作的记录的信息,可以在DML语句末尾使用RETURNING语句返回该记录的

43、信息。pRETURNING语句的基本语法:pRETURNING select_list_item INTO variable_list|record_variable; Oracle10g 数据库基础教程66pDECLAREp v_sal emp.sal%TYPE;pBEGINp UPDATE emp SET sal=sal+100 WHERE empno=7844 p RETURNING sal INTO v_sal;p DBMS_OUTPUT.PUT_LINE(v_sal);pEND;Oracle10g 数据库基础教程6714.3 14.3 控制结构控制结构 p选择结构p循环结构p跳转结构

44、Oracle10g 数据库基础教程6814.3.1选择结构选择结构pIF语句pCASE语句Oracle10g 数据库基础教程69(1)IF语句语句p语法语法pIF condition1 THEN statements1;pELSIF condition2 THEN statements2;ppELSE else_statements;pEND IF; p注意注意p条件是一个布尔型变量或表达式,取值只能是条件是一个布尔型变量或表达式,取值只能是TRUE,FALSE,NULL。Oracle10g 数据库基础教程70p例如,输入一个员工号,修改该员工的工资,如果该员工为10号部门,工资增加100;若

45、为20号部门,工资增加160;若为30号部门,工资增加200;否则增加300。 Oracle10g 数据库基础教程71pDECLAREp v_deptno emp.deptno%type;p v_increment NUMBER(4);p v_empno emp.empno%type;pBEGINp v_empno:=&x;p SELECT deptno INTO v_deptno FROM emp p WHERE empno=v_empno;p IF v_deptno=10 THEN v_increment:=100;p ELSIF v_deptno=20 THEN v_increm

46、ent:=160;p ELSIF v_deptno=30 THEN v_increment:=200;p ELSE v_increment:=300;p END IF;p UPDATE emp SET sal=sal+v_increment p WHERE empno=v_empno;pEND;Oracle10g 数据库基础教程72p由于PL/SQL中的逻辑运算结果有TRUE,FALSE和NULL三种,因此在进行选择条件判断时,要考虑条件为NULL的情况。例如,下面两个程序,如果不考虑条件为NULL的情况,则运行结果是一致的,但是若考虑条件为NULL的情况,则结果就不同了。 Oracle10g

47、 数据库基础教程73Oracle10g 数据库基础教程74p为了避免条件为NULL时出现歧义,应该在程序中进行条件是否为NULL的检查。 Oracle10g 数据库基础教程75(2)CASE语句语句p基本语法pCASEp WHEN condition1 THEN statements1;p WHEN condition2 THEN statements2;p p WHEN conditionn THEN statementsn;p ELSE else_statements;pEND CASE;p注意 p在CASE语句中,当第一个WHEN条件为真时,执行其后的操作,操作完后结束CASE语句。其他

48、的WHEN条件不再判断,其后的操作也不执行。 Oracle10g 数据库基础教程76p根据输入的员工号,修改该员工工资。如果该员工工资低于1000,则工资增加200;如果工资在10002000之间,则增加150;如果工资在20003000之间,则增加100;否则增加50。 Oracle10g 数据库基础教程77pDECLAREpv_sal emp.sal%type;pv_increment NUMBER(4);pv_empno emp.empno%type;pBEGINpv_empno:=&x;pSELECT sal INTO v_sal FROM emp p WHERE empno=

49、v_empno;pCASE p WHEN v_sal1000 THEN v_increment:=200;p WHEN v_sal2000 THEN v_increment:=150;p WHEN v_sal 50;p END LOOP;pEND; Oracle10g 数据库基础教程83(2)WHILE循环循环p基本语法pWHILE condition LOOP p sequence_of_statement;pEND LOOP; Oracle10g 数据库基础教程84p利用WHILE循环向temp_table表中插入50条记录。pDECLAREp v_counter BINARY_INTEG

50、ER :=1;pBEGINp WHILE v_counter = 50 LOOPp INSERT INTO temp_table VALUES (v_counter, Loop index);p v_counter := v_counter + 1;p END LOOP;pEND; Oracle10g 数据库基础教程85(3)FOR循环循环p基本语法pFOR loop_counter IN REVERSE p low_bound.high_boundpLOOPp sequence_of_statement;pEND LOOP;p注意:p循环变量不需要显式定义,系统隐含地将它声明为BINARY_

51、INTEGER变量;p系统默认时,循环变量从下界往上界递增计数,如果使用REVERSE关键字,则表示循环变量从上界向下界递减计数;p循环变量只能在循环体中使用,不能在循环体外使用。Oracle10g 数据库基础教程86p利用FOR循环向temp_table表中插入50条记录。pBEGINp FOR v_counter IN 1.50 LOOPp INSERT INTO temp_table VALUES (v_counter, Loop Index);p END LOOP;pEND;Oracle10g 数据库基础教程8714.3.3跳转结构跳转结构p语法格式:p标号p p GOTO 标号;p说

52、明:p块内可以跳转,内层块可以跳到外层块,但外层块不能跳到内层。pIF语句不能跳入。不能从循环体外跳入循环体内。不能从子程序外部跳到子程序中。p由于goto语句的缺点,建议尽量少用甚至不用goto语句。 Oracle10g 数据库基础教程88pDECLAREp v_counter BINARY_INTEGER :=1;pBEGINp p INSERT INTO temp_table VALUES (v_counter, Loop index);p v_counter := v_Counter + 1;p IF v_counter(p SELECT AVG(sal) FROM emp WHERE

53、 deptno=10);p ELSIF v_table = dept THENp OPEN v_cursor FOR SELECT deptno,count(*) num p FROM emp GROUP BY deptno;p ELSEp RAISE_APPLICATION_ERROR(-20000,Input must be p emp or dept);p END IF; Oracle10g 数据库基础教程131p LOOPp IF v_table = emp THENp FETCH v_cursor INTO v_emp;p EXIT WHEN v_cursor%NOTFOUND;p

54、DBMS_OUTPUT.PUT_LINE(v_emp.empno| | p v_emp.ename| | p v_emp.sal| |p v_emp.deptno);p ELSEp FETCH v_cursor INTO v_deptno,v_num;p EXIT WHEN v_cursor%NOTFOUND;p DBMS_OUTPUT.PUT_LINE(v_deptno| |v_num);p END IF;p END LOOP;p CLOSE v_cursor;pEND; Oracle10g 数据库基础教程13214.5 异常处理异常处理p异常概述p异常处理过程 p异常的传播Oracle10

55、g 数据库基础教程13314.5.1 异常概述异常概述pOracle错误处理机制p异常的类型Oracle10g 数据库基础教程134(1) Oracle错误处理机制错误处理机制pOracle中对运行时错误的处理采用了异常处理机制。 p一个错误对应一个异常,当错误产生时抛出相应的异常,并被异常处理器捕获,程序控制权传递给异常处理器,由异常处理器来处理运行时错误。 Oracle10g 数据库基础教程135(2)异常的类型)异常的类型p预定义的Oracle异常( Oracle错误)p非预定义的Oracle异常( Oracle错误)p用户定义的异常(用户定义错误)Oracle10g 数据库基础教程13

56、6p预定义的Oracle异常p当Oracle错误产生时,与错误对应的预定义异常被自动抛出,通过捕获该异常可以对错误进行处理。p常用预定义异常包括:Oracle10g 数据库基础教程137异常情况名错误代码描述CURSOR_ALREADY_OPEN ORA-06511 尝试打开已经打开的游标 INVALID_CURSORORA-01001不合法的游标操作(如要打开已经关闭的游标) NO_DATA_FOUNDORA-01403没有发现数据 TOO_MANY_ROWSORA-01422一个SELECT INTO语句匹配多个数据行INVALID_NUMBERORA-01722转换成数字失败 (X) V

57、ALUE_ERRORORA-06502截断、算法或转换错误,通常出现在赋值错误 ZERO_DIVIDEORA-01476除数为0 ROWTYPE_MISMATCHORA-06504主机游标变量与PL/SQL游标变量类型不匹配Oracle10g 数据库基础教程138异常情况名错误代码描述DUP_VAL_ON_INDEXORA-00001违反唯一性约束或主键约束SYS_INVALID_ROWIDORA-01410转换成ROWID失败TIMEOUT_ON_RESOURCEORA-00051在等待资源中出现超时LOGIN_DENIEDORA-01017无效用户名/密码CASE_NOT_FOUNDORA

58、-06592没有匹配的WHEN子句NOT_LOGGED_ONORA-01012没有与数据库建立连接STORAGE_ERRORORA-06500PL/SQL内部错误PROGRAM_ERRORORA-06501PL/SQL内部错误Oracle10g 数据库基础教程139异常情况名错误代码描述ACCESS_INTO_NULLORA-06530给空对象属性赋值COLLECTION_IS_NULLORA-06531对某NULL PL/SQL表或可变数组试图应用集合方法,而不是EXISTS SELF_IS_NULLORA-30625调用空对象实例的方法SUBSCRIPT_BEYOND_COUNTORA-0

59、6533对嵌套表或数组索引引用时超出集合中元素的数量SUBSCRIPT_OUTSIDE_LIMITORA-06532对嵌套表或可变数组索引的引用超出声明的范围Oracle10g 数据库基础教程140p非预定义异常p有一些Oracle错误没有预定义异常与其关联,需要在语句块的声明部分声明一个异常名称,然后通过编译指示PRAGMA EXCEPTION_INIT将该异常名称与一个Oracle错误相关联。此后,当执行过程出现该错误时将自动抛出该异常。Oracle10g 数据库基础教程141p声明一个异常名称pe_integrity EXCEPTION;p将异常与一个Oracle错误号相绑定pPRAGM

60、A EXCEPTION-INIT(e_integrity.-2291)p示例pDECLAREp e_deptno_fk EXCEPTION;p PRAGMA EXCEPTION_INIT(e_deptno_fk,-2292);pBEGINppEXCEPTIONppEND;Oracle10g 数据库基础教程142p用户自定义的异常p用户定义错误是指,有些操作并不会产生Oracle错误,但是从业务规则角度考虑,认为是一种错误。p用户自定义异常必须在声明部分进行声明。p当异常发生时,系统不能自动触发,需要用户使用RAISE语句。p在异常处理部分捕捉并处理异常。Oracle10g 数据库基础教程14314.5.2 异常处理过程异常

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论