1、1解释数据库的四个基本概念:数据、数据库、数据库管理系统、数据库系统。p1 DATA:数据就是事物的符号记录,是能够被计算机识别、存储和处理的信息。 DB:长期存储在计算机内、有组织的、可共享的数据集合。 DBMS:位于用户与操作系统之间的一层数据管理软件。 DBS:指引入数据库后的计算机系统,它一般由操作系统、数据库管理系统、数据库、应用程序、数据库管理员(Database Administrator,简称DBA)和用户构成。3简述数据库系统的三级模式结构与二级映像。p7,1. 简述启动Oracle9i数据库的一般步骤。p32 2. 简述启动Oracle9i模式中三个选项的区别。p32 3.
2、 简述关闭Oracle9i模式中四个选项的区别。 p33,4. 如何安装Oracle9i系统软件?如何正确地卸载Oracle9i软件? 1)安装Oracle 9i Database服务器端; 2)安装客户端Oracle9i Client; 3)再安装Oracle 9i Management and Integration; 卸载时: 1)先关闭所有Oracle服务和程序; 2)运行Oracle Universal Installer,选择卸装产品,选中已安装的产品,单击“删除”; 3)然后修改注册表,删除所有与oracle有关的注册表选项; 4)最后删除硬盘上的所有相关的包括文件在内的安装目录
3、。重新启动系统。,大型数据库概论 Introduction of Large Database第3章 PLSQL编程(1),学习目标1、掌握PL/SQL语句块的使用。 2、掌握PL/SQL中变量的使用。 3、掌握PL/SQL中常用数据类型的使用。 4、掌握PL/SQL中常用数据类型的使用。 5、掌握PL/SQL中主要控制结构的使用。,第5章 PL/SQL编程,PL/SQL是Oracle9i在标准SQL基础上扩展的一种过程化数据库编程语言,既具有标准SQL语言的简洁性,又具有过程语言的灵活性,体现了Oracle9i数据库的特点。PL/SQL是经过编译以后执行的,所以执行速度快于SQL语句,并减少
4、了服务器和客户机之间的网络传输,提高了数据库系统的效率。,PL/SQL基础,语法规则是构成任何程序设计语言的基石,PL/SQL也不例外。本节主要讨论PL/SQL语句块、变量、常用数据类型、表达式和运算符。,PL/SQL语句块,PL/SQL是一种结构化的语言,其程序结构的基本单位是“块”(Block),组成程序的块可以顺序出现,也可以相互嵌套,每个块执行程序的一个独立功能。PL/SQL语句块分匿名(anonymous)块和命名(named)块两种。匿名块是动态生成的,它只能执行一次;而命名块是具有名字的语句块,如存储在数据库内部的过程、函数、包和触发器等,可以执行多次。,PL/SQL语句块一般包
5、含三个部分:声明部分、执行部分和异常处理部分。其中,执行部分是必需的,其它两个部分是可选的。定义PL/SQL语句块的语法如下:DECLARE声明部分 /*主要声明变量、常量、自定义类型和游标等*/BEGIN执行部分 /*包含各种合法的PL/SQL语句*/EXCEPTION异常处理部分 /*当程序出现错误时执行该部分语句*/END; /*程序块结束*/,上面语法中各参数描述如下:n 声明部分:声明变量、常量、游标和自定义类型。n 执行部分:必须部分,描述了语句块所要完成的处理工作,可以使用SQL语句和过程性语句。n 异常处理部分:对错误进行处理。如果没有发生错误,该部分中的代码将不会被执行。,例
6、3.1 定义一个PL/SQL语句块。set serveroutput on;declarel_text varchar2(100);beginl_text:=Hello,World!;dbms_output.put_line(l_text);exceptionwhen others thendbms_output.put_line(引发了一个异常!);raise;end;,PL/SQL变量是可以存储数据的内存单元,其内容随着程序的运行可以发生变化。PL/SQL借助于变量可以与数据库进行通信,来自数据库中的信息可以赋给变量,而变量中的内容也可以被插入到数据库中。变量在PL/SQL语句块的声明部分
7、被声明。每一个变量都有一个特定的类型,该类型描述了可以在该变量中存储的数据类型(下一小节将讨论数据类型)。,PL/SQL变量,变量的命名及声明:,n 必须以字母开头,其后可跟随一个或多个字母、数字、货币符号、下划线和“#”字符。n 变量的最大长度是30个字符。n 变量名中不能有空格。PL/SQL语句块的声明部分声明变量(或常量)的语法如下:变量名 CONSTANT 数据类型 DEFAULT 值|NOT NULL:=值; 注意:每一行只能声明一个变量;声明一个常量要加上关键字CONSTANT,而且必须初始化,初始化后常量值就不能更改了。,例如,下面都是合法的变量声明:DECLARESno VAR
8、CHAR2(6);Sage NUMBER(2) NOT Null:=18;Date_Of_Today DATE NOT Null:=sysdate;Sclass CHAR(20) NOT Null:= 计算机科学与技术41;,3.1.3 PL/SQL常用数据类型,除了支持SQL标准的数据类型外,Oracle9i还为PL/SQL提供了一些特殊的数据类型。其中常用的数据类型有以下几种。1。字符类型字符类型用来存储字符数据,常用的字符类型有:CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG、LONG RAW和RAW等。, CHAR(LCHAR|BYTE)存储定长字符串。其中可选项
9、L(缺省值为1)是变量的长度,CHAR和BYTE分别用来指定L是以字符还是字节为单位(缺省为CHAR),一个字符可以包括一个或多个字节,这取决于系统的字符集设置。CHAR变量的最大长度是32767字节,CHAR数据库表列的最大长度是2000字节。, VARCHAR2(LCHAR|BYTE)存储变长字符串。VARCHAR2变量的最大长度是32767字节,VARCHAR2数据库表列的最大长度是4000字节。VARCHAR2还有两个子类型:STRING、VARCHAR,它们有着与VARCHAR2相同的范围,使用它们主要是为了与ANSI/ISO类型相兼容,建议使用VARCHAR2。, NCHAR(L)
10、和NVARCHAR2(L)存储定长和变长国际字符集数据,取值范围分别与CHAR和VARCHAR2相同.NCHAR和NVARCHAR2中的L始终是按字符指定的。,LONG变量存储变长字符串,这点与LONG数据库表列不同。LONG变量的最大长度是32760字节(比VARCHAR2变量少了7个字节),LONG数据库表列的最大长度是231字节。LONG RAW的精度与LONG相同,但LONG RAW存储的是二进制数据或字节字符串。RAW的精度与CHAR相同,但RAW存储的是二进制数据或字节字符串。, LONG、LONG RAW和RAW(L),2。数值类型:用来存储整数、实数和浮点数,常用的数值类型有N
11、UMBER、PLS_INTEGER和BINARY_INTEGER。 NUMBER(P,S)存储整数或浮点数。其中P是精度(指数值中所有数字的个数),S是刻度(指小数点右边数字的个数),S取负数表示由小数点开始向左计算数字的个数。P和S都是可选的,但是如果指定了刻度,则必须指定精度。,表5.1给出了不同的精度和刻度组合及其含义(四舍五入)。,NUMBER有许多子类型:DEC、DECIMAL、DOUBLE PRECISION、FLOAT、INTEGER、INT、NUMERIC、REAL、SMALLINT等。, PLS_INTEGER:存储有符号整数,精度范围是-231231,但数据库表列不能存储P
12、LS_INTEGER数据。与NUMBER相比,PLS_INTEGER占用较少的存储空间,并且可以直接进行算术运算(而NUMBER必须先转变成二进制才能进行算术运算)。PLS_INTEGER进行运算发生溢出时,会触发异常。 BINARY_INTEGER:存储类型与精度与PLS_INTEGER相似,但操作比PLS_INTEGER要慢,且运算发生溢出时,如果指派给一个NUMBER变量就不会触发异常。,3。日期/时间类型日期/时间类型用来存储日期、时间和时间间隔,常用的日期/时间类型有DATE、TIMESTAMP和INTERVAL。 DATE存储日期和时间数据,包括世纪、年、月、日、小时、分和秒(但不
13、存储秒的小数部分),缺省格式为DD-MON-YY。DATE数据占用7个字节,每个部分占一个字节。函数SYSDATE返回系统当前日期和时间。有效的日期和时间范围是公元前4712年1月1日公元9999年12月31日。, TIMESTAMP(P)存储年、月、日、小时、分和秒,但还可存储秒的小数部分。其中P是秒小数部分的精度,范围是09,缺省值是6。 TIMESTAMP(P) WITH TIME ZONETIMESTAMP类型的扩展,包含时区偏移(当地时间和格林尼治时间的差异)。,例如,以下脚本可以用来显示系统当前日期、时间及时区偏移。DECLAREV_TIME TIMESTAMP(3) WITH T
14、IME ZONE;BEGINSELECT SYSDATE INTO V_TIME FROM DUAL;DBMS_OUTPUT.PUT_LINE(V_TIME);END;, INTERVAL DAY(P1) TO SECOND(P2)存储天数、小时、分钟和秒之间的时间间隔。其中P1、P2分别指定天和秒的数字位数,范围为09,缺省值分别是2和6。4。Boolean类型:存储TRUE 、FALSE和 NULL。,declare v_inteval INTERVAL DAY(7) TO SECOND(5); begin v_inteval := INTERVAL 4 5:12:10.222 DAY T
15、O SECOND; dbms_output.put_line(v_inteval); end;,declare v_inteval INTERVAL YEAR(3) TO MONTH; begin v_inteval := INTERVAL 123-2 YEAR TO MONTH; dbms_output.put_line(v_inteval); end;,存储最大尺寸不超过4GB的无结构数据块(如文本、图像、声音和视频等),常用的LOB类型有BFILE、BLOB、CLOB和NCLOB。 BFILE:在数据库外的操作系统文件中存储大型的二进制文件,每个BFILE变量存储着一个文件定位器(包含一
16、个路径别名来指定一个完整路径),用来指向服务器上的大型二进制文件。 BLOB:在数据库内存储大型的二进制对象,每个BLOB对象存储一个定位器,指向大型的二进制对象。 CLOB:在数据库内存储大型的字符型数据,每个CLOB对象存储一个定位器,指向大型的字符型数据。 NCLOB:在数据库内存储大型的NCHAR类型数据,每个NCLOB对象存储一个定位器,指向大型的NCHAR类型数据。,5 LOB类型:,每个PL/SQL基类型(如上述数据类型)指定了一组值和一组适应该类型操作的约定,子类型不是一个新类型,而是基类型的候选名称,有着与基类型同样的操作约定。自定义子类型的语法:SUBTYPE 子类型名 I
17、S 基类型 NOT NULL;例如,以下脚本定义了一个子类型MYTYPE和MYTYPE类型的变量MYTEXT。DECLARESUBTYPE MYTYPE IS VARCHAR2(6);MYTEXT MYTYPE;,6 自定义子类型,7记录类型:,记录是PL/SQL中的一个复合类型,前面所讲述的都是标量类型。标量类型的内部没有可以单独操纵的元素,它与数据库表列的数据类型一般是一致的,而复合类型的内部含有可以单独操纵的元素。,记录类似于数据库表列的集合,表的%ROWTYPE属性实质上就是一种记录类型。 记录类型:PL/SQL记录类型类似于C语言中的结构体,声明记录类型的语法如下:DECLARETY
18、PE 记录名 IS RECORD (字段名1 NOT NULL:=值,字段名n NOT NULL:=值);, %TYPE:PL/SQL变量可用来处理数据库表中的数据,该变量必须拥有与数据库表列相同的类型。例如,要定义与system.student表中Sname列(类型为VARCHAR2(6))相同类型的变量studentname可以声明如下:DECLAREstudentname VARCHAR2(6);,但若Sname列的类型发生改变,则studentname变量必须重新定义,这是十分耗时和容易出错的。解决的办法是使用数据库表列的%TYPE属性,它对应着数据库表列的数据类型。如:DECLARE
19、 studentname system.student.Sname%TYPE;表示变量studentname的数据类型是基于表system.student中的Sname列的数据类型。如果Sname列的定义改变了,则studentname的数据类型也随之改变。, %ROWTYPE实际应用中,经常要将PL/SQL中的一个记录类型声明为对应于一个数据库表的数据行,如果该表有若干列,则声明记录时就需要若干行,这样的记录声明非常烦琐。为此,PL/SQL提供了%ROWTYPE运算符。例如,要定义一个与表system.student数据行相同的记录变量V_student,可以声明如下:DECLARE V_s
20、tudent system.student%ROWTYPE;表示记录变量V_student是基于表system.student数据行的数据类型。若表定义改变,则V_student也随之改变。,用来给变量赋值及对操作数处理。 1赋值运算符:= 作用是将赋值运算符右边表达式的值赋给其左边的变量。 2算术运算符:用于进行加、减、乘、除、乘方等算术运算,包括加+、减-、乘*、除/、乘方*。,3.1.4 PL/SQL运算符:,3关系运算符:用于将一个表达式与另一个表达式进行比较,包括等于=、不等于或!=、大于、小于=、小于等于=、介于BETWEENAND、测试IN、模糊匹配LIKE、是否非空IS NUL
21、L。 4逻辑运算符:用于对两个布尔表达式进行逻辑运算,包括逻辑与AND、逻辑或OR、逻辑非NOT。 5字符串连接运算符| 作用是将两个字符串连接起来。,3.1.5 PL/SQL表达式:由操作数和运算符构成,操作数可以是一个变量、常量或函数,组成表达式的操作数和运算符一起决定了该表达式的类型(字符、数值、日期等)。表达式可出现在赋值运算符的右边或者作为一个PL/SQL语句的一部分。,PL/SQL的控制结构包括顺序、选择、NULL和循环等四种结构。除了顺序结构外,PL/SQL主要通过选择、NULL和循环结构来控制和改变程序执行的逻辑顺序,从而实现复杂的运算或控制功能。此外,PL/SQL还提供GOT
22、O转移语句。,3.2 PL/SQL控制结构,3.2.1 顺序结构:按照语句出现的先后顺序执行,这与任何过程化的语言相同。 3.2.2 选择结构:PL/SQL中常用的选择结构有以下两种形式:1IF语句语法:IF 条件1 THEN 语句1;ELSIF 条件2 THEN 语句2; ELSE 语句n+1;END IF;,2 CASE语句语法:CASE 条件选择器WHEN 值1 THEN 语句1;WHEN 值n THEN 语句n;ELSE 语句n+1;END CASE;,例3.2 根据城市的名称查找在该城市的代理人的名称。DECLARECITY VARCHAR2(6):=南昌;BEGINCASE CIT
23、YWHEN 扬州 THEN DBMS_OUTPUT.PUT_LINE(老朱);WHEN 徐州 THEN DBMS_OUTPUT.PUT_LINE(老纪);WHEN 唐山 THEN DBMS_OUTPUT.PUT_LINE(老单);WHEN 南昌 THEN DBMS_OUTPUT.PUT_LINE(小蔡);END CASE;END;,3.2.3 NULL结构:也称空结构,显式指明不进行任何操作。如:SET SERVEROUTPUT ON;DECLAREV_Marks Number; V_Pass Number:=0;BEGINIf V_Marks60 THEN NULL;ELSE V_Pass:
24、=V_Pass+1;END IF;dbms_output.put_line(v_pass);END;,3.2.4 循环结构:PL/SQL中常用的循环结构有以下三种形式: 1 LOOP-EXIT(EXIT WHEN)-END LOOP语法:LOOP循环体END LOOP;这种循环结构简称LOOP循环,终止条件通过在循环体中加入EXIT或EXIT WHEN来实现。,例3.3 使用LOOP循环输出110的数值。SET SERVEROUTPUT ON;DECLARENUM BINARY_INTEGER:=1;BEGINLOOPDBMS_OUTPUT.PUT_LINE(NUM);NUM:=NUM+1;I
25、F NUM10 THEN EXIT;END IF;END LOOP;END;,本程序使用EXIT来终止循环,也可以使用EXIT WHEN来终止循环,程序如下:SET SERVEROUTPUT ON;DECLARENUM BINARY_INTEGER:=1;BEGINLOOPDBMS_OUTPUT.PUT_LINE(NUM);NUM:=NUM+1;EXIT WHEN NUM10;END LOOP;END;,2WHILE-LOOP-END LOOP语法:WHILE 条件 LOOP循环体END LOOP;这种循环结构简称为WHILE循环,表示当条件成立时执行循环体,条件不成立时退出循环。,例3.4
26、使用WHILE循环输出110的数值。SET SERVEROUTPUT ON;DECLARENUM BINARY_INTEGER:=1;BEGINWHILE NUM=10 LOOPDBMS_OUTPUT.PUT_LINE(NUM);NUM:=NUM+1;END LOOP;END;,3FOR-IN-LOOP-END LOOP语法:FOR 循环变量 IN REVERSE 初值终值 LOOP循环体END LOOP;简称FOR循环,执行过程是先将循环变量赋以初值,若未超过终值,则执行循环体。每次循环后循环变量自动加1,如未超过终值,则继续执行循环体,直至循环变量超过终值时退出循环。若用关键字REVERS
27、E,则每次循环后循环变量自动减1。,例3.5 使用FOR循环输出110的数值。SET SERVEROUTPUT ON;DECLARENUM BINARY_INTEGER;BEGINFOR NUM IN 110 LOOPDBMS_OUTPUT.PUT_LINE(NUM);END LOOP;END;,3.2.5 GOTO语句GOTO语句是一条无条件转移语句,能够实现程序从一处无条件转移到由标签所标识的语句。语法是 :GOTO ;其中,Label是定义的标签,用双尖括号括起来。GOTO语句一般使用在从一个PL/SQL语句块中跳到一个错误处理程序来引发异常。程序中过多地使用GOTO语句将导致流程复杂,
28、这种结构性较差的代码是很难被理解和维护的,因此PL/SQL提倡尽量不要使用GOTO语句,PL/SQL还禁止使用GOTO语句从外层跳转到内层语句、循环体、IF语句和CASE语句中。,例3.6 使用GOTO语句输出110的数值。SET SERVEROUTPUT ON;DECLARENUM BINARY_INTEGER:=1;BEGINLOOPDBMS_OUTPUT.PUT_LINE(NUM);NUM:=NUM+1;IF NUM10 THEN GOTO label1;END IF;END LOOP; NULL;END;,习题3 1. 简述PL/SQL语句块的分类及构成。 2. 简述%TYPE和%ROWTYPE的使用方法。,