课程目标:1. 了解数据库系统在项目开发中的地位2. 了解目前主流数据库系统3. 熟练掌握查询命令4. 熟练掌握数据操作方式5. 熟练使用数据库内置函数6. 掌握pl/sql程序设计语法结构7. 掌握视图8. 掌握存储过程9. 掌握用户自定义函数10. 掌握触发器了解:1.数据库组件:1.1 实施应用集群1.2 Oracle OLAP1.3 数据挖掘1.4 应用程序接口1.5 网络组件1.6 SQL Plus1.7 企业管理器OEM2. 几个版本间的差异:2.1 增加了服务器参数文件SPFILE2.2 使用了OMF免去了手工管理数据库文件的繁琐2.3 支持多种数据库块大小2.4 会话可以自动调整PGA的大小2.5 引入了列表分区课程内容:1. 操作数据之前的准备工作:1.1. 要保证有一个数据库:1.2. 要保证创建一个表空间create tablespace hbjrdatafile 'E:\dbs\hbjr.dbf' size 100M;1.3. 要创建一个用户,用户默认的表空间就是你创建的表空间create user hbjridentified by orcldefault tablespace hbjr;//授权限:grant dba to hbjr;1.4. 用户/密码登录:2. 表名/列字段名起名规范:2.1 使用常规字母和数字2.2 长度不要超过302.3 表名/列名不能重复2.4 不能使用oracle的保留字3. 数据类型3.1 char:定长,存储单位--字节(bite)3.2 varchar2:变长,存储单位--字节3.3 nchar:定长,存储单位--字符3.4 nvarchar2:变长,存储单位--字符3.5 date:日期类型,7个字节,存储着--世纪,年,月,日,时,分,秒3.6 timestamp:日期类型,11个字节,存储着--世纪,年,月,日,时,分,秒,毫秒3.7 number:数据类型(数值类型)3.8 clob:大字段类型,适合存储纯文本信息(例如:*.txt 文件)3.9 blob:大字段类型,适合存储二进制文件(例如:图片)3.10 定义数据类型的意义:3.10.1 能够更有效,更直观的描述外部数据信息3.10.2 从程序运行角度来考虑,定义了一种数据类型,实际就是定义了一种存储格式和在此格式上的运算方式,也就是数据结构+算法,通过这种预先定义的机制,计算机可以加快程序运行的速度。
4. 创建表/修改表/删除表(DDL)4.1 创建表:4.1.1 语句格式:create table tableName(colName dataType,colName dataType);4.1.2 规范:4.1.2.1 列字段至少要有一个4.1.2.2 列字段名称后必须跟着数据类型4.1.2.3 如果有两个及两个以上的字段,那么字段之间用逗号(,)分隔4.1.2.4 列名称不允许重复(在表中不得重复)4.1.2.5 表名称不允许重复(在数据库中不得重复)4.1.3 示例:create table test(tid char(10),tname varchar2(20));4.2 删除表:4.2.1 语句格式:drop table tableName;4.2.2 示例:drop table test;4.3 更改表4.3.1 添加一个列:格式:alter table tableName add columnName dataType;示例:alter table student add addr varchar2(100);4.3.2 删除一个列:格式:alter table tableName drop column columnName;示例:alter table student drop column addr;4.3.3 添加多个列:格式:alter table tableName add(columnName1 dataType,columnName2 dataType,colunmName3 dataType);示例:alter table student add (addr varchar2(100),age int,dept varchar2(50));4.3.4 删除多个列:格式:alter table tableName drop (columnName1,columnName2);示例:alter table student drop (addr,age);4.3.5 更改一个列(更改列的定义--数据类型)格式:alter table tableName modify columnName newDataType;示例:alter table student modify dept varchar2(100);4.3.6 更改多个列:格式:alter table tableName modify(columnName1 newDataType,columnName2 newDataType,colunmName3 newDataType);示例:alter table student modify(stu_no char(20),stu_name varchar2(20),dept varchar2(60));4.3.7 更改列名称:格式:alter table tableName rename column oldColumnName to newColumnName;示例:alter table student rename column dept to sDepartment;注释:alter,drop,create属于DDL语言5. 增加/删除/修改:5.1 往表里插入一条数据:5.1.1 插入若干列的值:格式:insert into tableName(columnName1,columnName2)values ('value1',value2);5.1.2 插入全部列的值:格式:insert into tableNamevalues(有多少个列字段此处就赋值多少个);5.2 从表里删除数据格式:delete from tableName where --- 条件或者:tauncate table table_name <!--tauncate:截断表-->5.3 修改表记录:格式:update tableName set columnName=newValue where --- 条件6. 查询:6.1 查询全部数据格式:select * from tableName--查询全部学生的信息--示例:select * from student;6.2 查找特定的列(若干列)格式:select columnName from tableName;-- 查询所有学生的姓名--示例:select stu_name from student;6.3 查找符合条件的部分数据用where表示过滤的条件格式:select * from tableName where --- 条件-- 查询所有机电系的学生信息--示例:select * from student where sdepartment='jdx';6.4 列别名格式1:columnName alias格式2:columnName as alias格式3:columnName as "alias"示例:select stu_no 学号,stu_name 姓名,sdeaprtment 系别from studnet;6.5 distinct:消除重复行格式:select distinct columnName from tableName;--查询院里都设置了那些系别--示例:select disctinct sdepartment from studnet;6.6 查询常量:格式:select 'finalData' from tableName;示例:select stu_name,'河套大学' from student;6.7 使用表达式(算术表达式/关系表达式/逻辑表达式/连接运算符/模糊查询/范围查询)6.7.1 关系表达式:=,>=,>,<=,<,<>,!=-- 查询所有分数>=60的学生的信息:--示例: select * from student where grade>=60;6.7.2 范围运算符:between and, in-- 查询所有分数在60-80这个范围的学生的信息--select * from student where grade between 60 and 80;-- 查询所有机电系,师范系,艺体系的学生的信息--select * from student where sdepartment in('jdx','sfx','ytx');6.7.3 模糊查询:like一般和like搭配使用的符号:%, _-- 查询所有姓zhao的同学的信息--示例:select * from student where stu_name like 'zhao%';-- 查询所有姓zhao的并且名字只有一个字的同学的信息--示例:select * from studnet where stu_name like 'zhao_';6.7.4 逻辑表达式:and,or,not--- 查询所有机电系或者医学院系的学生的信息---示例:select * from student where sdepartment='jdx' or sdepartment='yxy';--- 查询所有机电系的并且成绩>=60的学生的信息---示例:select * from student wheresdepartment='jdx' and grade>=60;--- 查询所有不是艺体系的学生的信息---示例:select * from student where not (sdepartment='ytx');6.7.5 连接运算符:|| 将若干个字段或者字符串拼接而成一个列--- 将学生的姓名和成绩拼接然后显示---示例:select stu_name || '的成绩是:' || grade 成绩信息from studentwhere stu_no = 5555;6.7.6 null:是未分配的,或者未知的,或者不可用的6.7.6.1 如何插入null值:--- 将学生的姓名和系别分别置空---示例:insert into student values(123,null,null,0);6.7.6.2 如何查询null值:-- 查询所有姓名为空的学生的信息--示例: select * from student where stu_name is null;6.7.6.3 如何修改null值:--- 将所有姓名为空的学生重命名为'待定' ---示例:update student set stu_name ='待定'where stu_name is null;6.7.6.4 如何删除null值:--- 将所有姓名未知的学生记录删除---示例:delete from student where stu_name is null;6.7.6.5 null参与运算的结果:a. 参与数学运算:结果为nullb. 参与关系运算:忽略c. 参与逻辑运算:d. 参与连接运算:为null的字段其值处理为空的字符串e. 参与排序,其值最大6.8 order:排序--asc:升序,默认的,desc--降序6.8.1 order by 总是在where 条件之后出现--- 将所有学生的信息按照分数降序排列---示例:select * from student order by grade desc;6.8.2 当order by 中出现两个或者两个以上的字段排序是先是按照第一个出现的字段整体排序然后在第一个字段值相同的情况下再按照第二个字段进行排序然后在第一个和第二个字段都相同的情况下再按照第三个字段进行排序…………依次类推--- 查询所有的学生信息,按照分数降序,编号升序的顺序进行排列---示例:select * from student order by grade desc, stu_no asc;6.9 系统函数:6.9.1 系统函数无一例外都是提供某种功能的,例如:nvl6.9.2 几乎总是出现在字段名的前面6.9.3 分类:a.字符函数b.数值函数c.日期函数d.转换函数--to_char,to_date,to_numbere.通用函数f. 分组函数f.1 max(), min(), avg(), count(), sum()f2. decode()6.9.4 操作日期函数:1. 插入系统当前时间:示例:insert into emp(empno,ename,hiredate) values(8010,'zhuaoshuai',sysdate);2. 插入指定的时间(按oracle数据库默认格式插入)示例:insert into emp(empno,ename,hiredate) values(8020,'panzhiming','01-2月-11');3. 插入指定格式的日期:示例:insert into emp(empno,ename,hiredate) values(8030,'tudou',to_date('2011/01/01','yyyy/mm/dd'));insert into test1(t2) values(to_date('2013-10-1013:13:13','yyyy-mm-dd hh24:mi:ss'));6.10 group子句:6.10.1 功能:对数据进行分组--- 查询各个岗位的职员人数---示例:select job ,count(job) from emp group by (job); <!--count:计数-->6.11 having:对group by子句再次过滤--- 查询部门人数>=4的所有部门-----示例:select deptno,count(deptno) from emp group by (deptno) having count(deptno)>=4;6.12 连接查询:6.12.1 内连接--边表的数据得匹配上,任何一方如果和对方表没有匹配的数据,则会被过滤掉a. 等值连接:--查询在纽约工作的员工信息:select e.*from emp e,dept dwhere e.deptno = d.deptno and d.loc = 'NEW YORK'--查看员工员工信息及其工作地selectempno,ename,job,sal,comm,e.deptno,dname,locfrom emp e, dept dwhere e.deptno = d.deptno;b. 非等值连接:--查询工资级别是3的员工的信息:select e.*from emp e, salgrade swhere e.sal >= s.losal and e.sal <= s.hisal and s.grade = 3--查看员工编号,姓名,岗位,薪水及其薪水级别select empno,ename,job,sal,gradefrom emp e, salgrade sgwhere e.sal > sg.losal and e.sal <=sg.hisal;6.12.2 外连接--主表数据全部保留,子表数据需要匹配,如果匹配不上,则被过滤a. 左外连接:以左表为主--查看车辆信息及其车主的信息select cid,cname,phone, c1.car_id,producer,price,produe_datefrom cars c1, customers c2where c1.car_id = c2.car_id(+);--查看员工信息,如果有所属部门则显示其部门信息select e.*, d.*from emp e, dept dwhere e.deptno = d.deptno(+);b. 右外连接:以右表为主--查看顾客信息及其所购车的信息select cid,cname,phone, c1.car_id,producer,price,produe_datefrom cars c1, customers c2where c1.car_id(+) = c2.car_id;--查询所有部门信息,如果该部门有员工则显示其员工信息select d.*, e.*from emp e, dept dwhere e.deptno(+) = d.deptnoc. 全连接:左右两表不分主次,保留全部数据--查询所有员工和部门的信息:select e.*, d.*from emp efull outer join dept don e.deptno = d.deptno6.12.3 自连接:将一个表当成多个表用--查询员工的编号,姓名,及其经理编号,姓名selectworker.empno,worker.ename,worker.mg r,manager.enamefrom emp worker, emp managerwhere worker.mgr = manager.empno; selectworker.empno,worker.ename,worker.mgr,manager.enamefrom emp worker, emp managerwhere worker.mgr = manager.empno(+);上述多表连接的另一种写法:55select table1.columnName, table2.columnNamefrom table1[inner | left | right | full] join table2on table1.columnName = table2.columnName注意:如果使用(+)操作符指定外连接,则必须使用where子句指定连接条件如果使用关键字指定内、外连接,则必须使用on 子句指定连接条件6.13 子查询:---- -----示例:select * from emp where deptno=(select deptno from dept where loc='NEW YORK');查询所有在纽约工作的职员的信息6.13.1 单行子查询:返回单个结果,一般和关系运算符结合使用示例:---- 查询所有在纽约工作的职员的信息-----select * from emp where deptno=(select deptno from dept where loc='NEW YORK');6.13.2 多行子查询:返回多个结果,一般和in, all, any, exists 结合使用示例:---- 查询和MARTIN和SMITH同一个部门的职员的信息-----select *from empwhere job in(select jobfrom empwhere ename = 'MARTIN'or ename = 'SMITH');6.13.3 多列子查询:返回多个列值,有可能单行或多行示例:---- 查询和ALLEN同部门且同岗位的职员的信息(单行) -----select *from empwhere (deptno,job) = (select deptno, jobfrom empwhere ename = 'ALLEN');---- 查询和ALLEN同部门且同岗位或者和SMITH同部门且同岗位的职员的信息(多行) -----select *from empwhere (deptno,job) IN (select deptno, jobfrom empwhere ename = 'ALLEN'or ename = 'SMITH');6.13.4 相关子查询:子查询和主查询相互依赖,但是主查询只关心子查询有无返回值,而不关心子查询返回的内容示例:---- 查询至少有一个员工的部门的信息-----select deptno, dnamefrom dept dwhere exists(select 'y'from emp ewhere e.deptno = d.deptno);6.14 联合结果集:union(无条件连接),minus(A减B的结果),intersect (交集), merge(融合)融合:示例:create table day_balance_table(eid char(5),ename varchar2(20),esal number);create table month_balance_table as select * from day_balance_table;insert into day_balance_table values('001','zhang',100);insert into day_balance_table values('002','wang',200);insert into day_balance_table('003','li',300);merge into month_balance_table musing day_balance_table don(m.eid = d.eid)when matched thenupdate set m.esal=d.esalwhen not matched theninsert(m.eid,m.ename,m.esal)values(d.eid,d.ename,d.esal);update day_balance_tableset esal = 400where eid = '001';insert into day_balance_tablevalues('004','eniay',500);merge into month_balance_table musing day_balance_table don(m.eid = d.eid)when matched thenupdate set m.esal=d.esalwhen not matched theninsert(m.eid,m.ename,m.esal)values(d.eid,d.ename,d.esal);6.15 分页查询:将rownum 固化select rn 序号, empno 员工编号, ename 姓名, job 职位, sal 工资from(select rownum rn, empno, ename, job, salfrom(select empno, ename, job, salfrom emporder by sal desc) t1) t2where rn >=4 and rn<=6;6.16 层次查询:select level 层次, empno 编号, ename 姓名, mgr 经理编号from empstart with mgr is nullconnect by mgr = prior empno;select (lpad(' ', 4*(level-1), ' ') || empno || '-' || ename)员工管理层次from empstart with mgr is nullconnect by mgr = prior empno;6.17 top-n:rownum使用时注意select *from empwhere rownum <3order by sal;select *from (select * from emp order by sal) twhere rownum < 37. 各种约束:7.1 not null: 不为空,此列输入的值不允许为空,允许重复7.2 unique: 唯一约束7.2.1 此列不允许输入重复的值,但是允许输入若干次空值7.2.2 有两种定义unique约束的方法:a. 直接在要定义约束的列字段后面写:unique 就可以了b. 不在列字段后紧跟着,而是在表的最后定义约束,格式如下:constraint conName conType(colunmName)--- 为列sid 定义唯一约束---示例:constraint student_sid_uk unique(sid)7.2.3 当定义一个unique同时约束若干个字段时,只要这几个字段的组合不重复就可以7.3 primary key:主键,不允许为空且不允许重复7.3.1 此列不允许为空并且不允许重复7.3.2 有两种定义primary key 的方法:a. 直接在要定义约束的列字段后面写:primary key 就可以了b. 不在列字段后紧跟着,而是在表的最后定义约束,格式如下:constraint conName conType(colunmName)--- 将列sid设置为主键---示例:constraint student_sid_pk primary key(sid)7.3.3 一个表只允许定义一个primary key7.4 check:一般是对列值的取值范围作约束(自定义完整性)constraint conName conType(把列值的取值范围规定好)--- 规定成绩表中的成绩字段取值范围在0--150之间---示例: constraint grade_ggrade_ck check((ggrade>=0) and (ggrade<=150));7.5 foreign key:主要是约束数据完整性的---- 为成绩表做一个外键映射关联到主表学生表,以保证成绩表的学生学号都是已存在的----示例:1. 创建表时做外键映射:create table grade(gid char(10) ,cj number(3),constraint grade_stu_fk foreign key(gid) references student(sid));2. 表创建好后做外键映射的格式:alter table grade add constraint grade_stu_fk foreign key(gid) references student(sid);7.6 default:插入或修改数据时,此列如果没有插入值则为其设置默认值8. 次重要内容:8.1 视图:创建,删除,使用--查询8.1.1 创建:示例:create or replace view salry_viewasselect ename, ((nvl(sal,0)) + (nvl(comm,0))) salary from emp;8.1.2 使用:和查询表的操作是一样的示例:select * from salry_viewwhere ename = 'ALLEN';8.1.3 删除:drop view salry_view;8.1.4 优点:a. 限制对表的数据的访问b. 可以使复杂的查询变得简单c. 提供了数据的独立性d. 提供了对相同数据的不同显示方式8.2 序列:创建,使用,删除用途:每次调用时自动增加一个步长值,然后将增加后的值返回8.2.1 创建:示例:create sequence seq_stu_sidincrement by 3 <!--increment:自增长-->start with 10nomaxvaluenocyclenocache8.2.2 使用:和查询表的操作是一样的示例:select seq_stu_sid.nextval from dual;8.2.3 删除:drop sequence seq_stu_sid;8.3 自定义函数:创建,调用,删除8.3.1 用途:就是提供某种功能的8.3.2 创建:示例:create or replace function salaryFun(eno emp.empno%type)return varchar2asbegin代码;end;8.3.3 使用:和系统函数的用法类似示例:select salaryFun(7369) from dual;8.3.4 删除:drop function salaryFun;8.3.5 示例:--创建一个函数create or replace function salaryFun(eno emp.empno%type) return varchar2 --声明返回值类型asv_salary number; --声明变量beginselect ((nvl(sal,0))+(nvl(comm,0))) into v_salary from emp where empno=eno;return(eno || '的总收入是:' || v_salary);end salaryFun;--- 使用自定义函数select salaryFun(7499) from dual;8.4 存储过程:创建,调用,删除8.4.1 用途:提供某种功能的,往往是一次性执行若干条DML语句的8.4.2 创建:create or replace procedure stuinsertasbegin代码段;end;8.4.3 使用:有两种方法可以调用存储过程8.4.4 删除:drop procedure stuinsert;8.4.5 示例1:无参存储过程--- 创建一个存储过程,一次性插入100条数据------- 1. 创建表---create table student(sid char(10), sname varchar2(20));--- 2. 往student表里一次性插入100条数据---create or replace procedure stuInsertasbeginfor v_temp in 1..500 loopinsert into student values(to_char(v_temp),'dfdf');end loop;end;--- 3. 调用存储过程-------3.1 第一种调用方法----beginstuinsert;end;---3.2 第二种调用方法:命令---execute stuinsert;8.4.6 传入参数:--- 根据员工编号修改其工资信息---create or replace procedure change_salary2(v_empno in number, v_new_sal in number)asbeginupdate empset sal = v_new_salwhere empno = v_empno;commit;end;8.4.7 传出参数:--- 根据员工编号获取其工资信息---create or replace procedure getSalaryByNo(v_empno in number, v_sal out number)asbeginselect sal into v_salfrom empwhere empno = v_empno;end;declarev_sal number;begingetSalaryByNo(7499, v_sal);dbms_output.put_line('员工工资:' || v_sal); end;--- 根据员工编号获取其姓名信息---create or replace procedure getNameByNo(v_empno in number, v_ename out varchar2)asbeginselect ename into v_enamefrom empwhere empno = v_empno;end;declarev_ename emp.ename%type;begingetNameByNo(7900, v_ename);dbms_output.put_line('员工姓名:' || v_ename); end;8.4.8 传入、传出参数:--- 根据员工编号获取其工资信息---create or replace procedure getSalaryByNo2(v_num in out number)asbeginselect sal into v_numfrom empwhere empno = v_num;end;declarev_num number;beginv_num := 7876;getSalaryByNo2(v_num);dbms_output.put_line(v_num || '员工的工资:' || v_num);end;8.4.9 优点:a. 大大增强了sql语言的功能和灵活性b. 可保证数据的安全性和完整性c. 改善sql语句的性能,执行速度快d. 可以降低网络的通信量e. 使提现企业规则的运算程序放入数据库服务器中以便集中控制8.4.10 存储过程与自定义函数的区别:a. 参数模式:前者可以使in,out, 后者只能是inb. return: 前者不包含,后者必须包含c. 执行方式:前者可以用execute语句执行,后者不可以8.5 触发器:创建,删除8.5.1 用途:监控某种事件的发生,一旦事件发生了系统会自动调用8.5.2 创建:create or replace trigger stuinsert_triggerbefore | after insert|delete|update on student(在操作之前/之后触发) (触发代码的操作类型) (操作的表)begin被触发的操作代码段;end;8.5.3 调用:当监控的操作一旦发生则触发器就被系统自动调用8.5.4 删除:drop trigger stuinsert_trigger;8.5.5 示例:--- 创建一个触发器----create or replace trigger stuInsert_triggerafter insert on studentbegindbms_output.put_line('您在学生表上进行了插入操作!');end;---- 触发触发器的-----insert into student values('121','dfdsf');8.5.5.1 语句级别触发器:一条语句触发一次示例:--- 如果在非工作日的非工作时间插入数据则操作不成功---create or replace trigger secure_deptbefore insert on deptbeginif(to_char(sysdate, 'DY') in ('星期六', '星期日'))or (to_char(sysdate, 'HH24:MI') not between '08:00' and '18:00')thenraise_application_error(-20001, 'you can insert into the table of dept only in work time!');end if;end;--向dept表插入数据测试触发器是否工作:insert into deptvalues(2345,'SOFT', 'HZ');8.5.5.2 行级触发器:一行就触发一次示例:--- 如果工作岗位不是MANAGER或者ANALYST,则工资不能超过5000 ---create or replace trigger restrict_salbefore insert or update of sal on empfor each rowbeginif (not(:new.job in ('MANAGER', 'ANALYST'))) and :new.sal > 5000thenraise_application_error(-20002, '普通员工不能赚到这么多薪水');end if;end;--向emp表插入或者修改数据测试insert into emp(empno, ename, job, sal)values(7941, 'Eniyah', 'CLERK', 3000);insert into emp(empno, ename, job, sal)values(7942, 'Phennma', 'CLERK', 5500);update empset sal = 5001where empno = 7941;8.6 同义词:类似于对象的别名,可以代替对象的原名称进行使用8.6.1 创建:create synonym synName for object; --当前用户可用或者:同义词;同义字create public synonym synName for object; --所有用户可用8.6.2 示例:create synonym t1 for test1;为 test1表创建同义词后,则可以把 t1 当成test1表使用8.6.3 用途:a. 可以方便的访问其他对象b. 可以缩短对象名字的长度c. 在分布式数据库中,它可以使用户操作远程对象像操作本地对象一样方便8.6.4 删除:drop synonym t1;8.7 包:8.7.1 用途可以将多个功能或用途相近的程序单元(存储过程或者函数等)组合到一起形成一个逻辑上的集合8.7.2 创建create or replace package tp1asfunction salaryFun(eno emp.empno%type) return varchar2;procedure change_salary2(v_empno in number, v_new_sal in number);procedure getSalaryByNo(v_empno in number, v_sal out number);end tp1;/create or replace package body tp1as-- 根据员工编号获取员工的工资信息:function salaryFun(eno emp.empno%type)return varchar2asv_salary number;beginselect((nvl(sal,0))+(nvl(comm,0))) into v_salary from emp where empno=eno;return(eno || 'µÄ×ÜÊÕÈëÊÇ£º'|| v_salary); end salaryFun;-- 根据员工编号修改其工资信息:procedure change_salary2(v_empno in number, v_new_sal in number)asbeginupdate empset sal = v_new_salwhere empno = v_empno;commit;end change_salary2;-- 根据员工编号获取员工的工资信息:procedure getSalaryByNo(v_empno in number, v_sal out number)asbeginselect sal into v_salfrom empwhere empno = v_empno;end getsalarybyno;end tp1;/8.7.3 使用--调用包中的程序单元:select tp1.salaryFun(7369) from dual;select empno,ename,job,sal, tp1.salaryFun(empno) from emp;begintp1.change_salary2(7369, 3200);end;declarev_sal number;begingetSalaryByNo(7499, v_sal);dbms_output.put_line('员工的工资是:'|| v_sal);end;8.7.4 删除drop package tp1;8.8 索引:8.8.1 用途:提升查询效率9. PL/SQL开发介绍9.1 PL/SQL存在的意义:它是对标准SQL语言的扩展,增加了编程语言的特点,以实现复杂的功能或计算9.2 语法结构a. 程序块署名的声明b. 变量、常量的声明--- declarec. 程序体--- begin end;d. 异常处理--- exception9.3 数据类型9.3.1 数据库中的数据类型它都可以使用9.3.2 %type -- 映射某张表的某个字段的类型%rowtype --- 映射某张表的某行记录的类型9.4 流程控制:9.3.1 分支:if(condition) thenelsif(condition) thenelsif(condition) thenelseend if;9.3.2 循环:a. loopexit [when 退出条件];end loop;b. for 变量in 最小值.. 最大值loopend loop;c. while 条件loopend loop;d. 标签。