《Oracle数据库技术与应用(高级)完整版课件全书电子教案教材课件(完整).ppt》由会员分享,可在线阅读,更多相关《Oracle数据库技术与应用(高级)完整版课件全书电子教案教材课件(完整).ppt(101页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 一 章 第四章一PL/SQL编程第章企业级卓越人才培养目标目标掌握PL/SQL语法结构掌握数据类型的分类及变量的使用掌握各种运算符的使用掌握各种控制语句的使用掌握在PL/SQL中进行异常处理PL/SQLPL/SQL语言语言PL/SQL是一种高级数据库程序设计语言 PL/SQL代表面向过程化的语言与S Q L语言的结合 PL/SQL将第四代语言的强大功能和灵活性与第三代语言的过程结构的优势融为一体 PL/SQL具有编程结构、语法和逻辑机制 PL/SQL用于在各种环境下对Oracle数据库进行快速高效访问PL/SQLPL/SQL语言语言PL/SQL语言内容PL/SQL块结构变量与常量数据类型运
2、算符流程控制空操作和空值PL/SQLPL/SQL块结构块结构PL/SQL程序包含了一个或多个PL/SQL块PL/SQL块语法结构 DECLARE声明部分BEGIN执行部分EXCEPTION异常处理部分END;PL/SQLPL/SQL块结构块结构示例:在数据库emp表中修改一名雇员记录,如果没有该记录则创建一条新记录 DECLAREv_nonumber(4):=8033;-定义变量v_namevarchar2(10):=张三;v_jobvarchar2(9):=SALESMAN;BEGINUPDATEempSETjob=v_jobWHEREempno=v_no;-更新雇员表IFSQL%NOTFO
3、UNDTHEN-检查记录是否存在,如不存在就插入记录INSERTINTOemp(empno,ename,job)VALUES(v_no,v_name,v_job);ENDIF;END;/变量与常量变量与常量 声明变量variable_nameCONSTANTdatatypeNOTNULL:=DEFAULTEXPRESSION给变量赋值有两种方式 DECLAREvar1number:=1;/*声明变量并初始化*/var2varchar2(10);/*声明变量*/BEGINvar2:=zhangsan;/*给变量赋值*/END;/变量与常量变量与常量可以通过SELECT INTO(或 FETCH
4、INTO)给变量赋值 DECLAREvar1varchar2(10);BEGINSELECTenameINTOvar1FROMempWHEREempno=7788;dbms_output.put_line(var1);END;/变量与常量变量与常量常量:值在程序内部不能改变声明常量必须包括关键字CONSTANT var1constantnumber:=3;数据类型数据类型标量类型属性类型用户自定义类型数据类型数据类型属性类型%type引用表中列的类型%rowtype 引用表中行的类型例如:-%typevar1emp.ename%type;-%rowtypevar2emp%rowtype;运算符
5、运算符算术运算符+,-,*,/,mod关系运算符,=,0THENNULL;ELSEdbms_output.put_line(正常);ENDIF;PL/SQLPL/SQL异常处理异常处理PL/SQL块中可以有异常处理部分EXCEPTIONWHENexcep_name1THENWHENexcep_name2THENWHENOTHERSTHENEND;异常有两种 预定义的异常 用户定义的异常系统预定义异常系统预定义异常例:除零异常declarenumnumber(3):=10;zeronumber(3):=0;resultnumber(6);beginresult:=num/zero;excepti
6、onwhenZERO_DIVIDEthendbms_output.put_line(被零除!);end;用户定义异常用户定义异常当部门员工数超过规定人数引发自定义异常declareovernumberEXCEPTION;-用户定义的异常maxnumconstantnumber:=5;numnumber;beginselectcount(*)intonumfromempwheredeptno=&部门编号;ifnummaxnumthenRAISEovernumber;-使用RAISE语句引发自定义异常endif;dbms_output.put_line(该部门雇员人数为:|num);excepti
7、onwhenovernumberthendbms_output.put_line(该部门雇员人数超过了规定人数!);end;总结总结PL/SQL语言是面向过程语言与SQL语言的结合数据在数据库与PL/SQL程序之间是通过变量进行传递的。变量通常是在PL/SQL块的声明部分定义除了15种标量数据类型外,Oracle还提供了属性类型。并允许用户自定义类型Oracle中使用的运算符,流程控制语法和其他语言的类似Oracle中提供了异常(Exception)这一处理错误情况的方法。在PL/SQL代码部分执行过程中无论何时发生错误,控制自动地转向执行异常部分在 PL/SQL中可以处理系统预定义的异常,也
8、可以使用自定义的异常2023/3/12第四章二游标、集合和OOP的概念第章企业级卓越人才培养21目标目标理解游标、集合的概念和作用掌握在PL/SQL中游标的基本用法了解Oracle数据库中OOP的基本概念22游标游标PL/SQL用游标(cursor)来管理 select语句游标分类静态游标显式游标(explicit cursor)隐式游标(implicit cursor)游标变量 23显式游标显式游标显式游标的使用步骤声明游标(declare)打开游标(open)读取数据关闭游标(close)24显式游标显式游标声明游标 CURSORcursor_nameISselect_statement示
9、例DECLARECURSORemp_curISselectename,job,salfromemp;25显式游标显式游标打开游标 OPENcursor_name;示例BEGINOPENemp_cur;dbms_output.put_line(emp_cur%ROWCOUNT);END;26显式游标显式游标读取数据 FETCHcursor_nameINTOvariable_name,n;示例BEGINOPENemp_cur;FETCHemp_curINTOname,job,sal;/*从结果集中提取一行数据*/WHILEemp_cur%FOUNDLOOPdbms_output.put_line(
10、name|job|sal);FETCHemp_curINTOname,job,sal;/*在循环中每次提取一行数据*/ENDLOOP;CLOSEemp_cur;END;27显式游标显式游标关闭游标CLOSEcursor_name;示例BEGINCLOSEemp_cur;END;28显式游标显式游标游标的属性%FOUND 检测当前游标指向的行是否有数据%NOTFOUND 与%FOUND相反%ROWCOUNT 从游标中已提取的总行数%ISOPEN 检测游标是否已打开29隐式游标隐式游标在PL/SQL程序段中使用SELECT语句进行操作,PL/SQL语言会隐含地处理游标定义示例:DECLAREnam
11、evarchar2(10);BEGINselectenameintonamefromempwhereempno=7934;dbms_output.put_line(name);END;30隐式游标隐式游标使用隐式游标要注意以下几点 每个隐式游标必须有一个INTOINTO接受的变量类型要与列表的一致隐式游标一次仅能返回一行数据,使用时必须检查异常。最常见的异常有“no_data_found”和“too_many_rows”31游标变量游标变量游标变量是动态的,它不与特定的查询绑定在一起。可以为任何兼容的查询打开游标变量,从而提高更好的灵活性。创建游标变量有两个步骤:定义 REF CURSOR 类
12、型,即引用游标类型声明这种类型的游标变量32游标变量游标变量声明一个引用游标类型-强类型游标(指定返回类型)TYPEdept_curISREFCURSORRETURNdept%rowtype;-弱类型游标(没有返回类型)TYPEmycurISREFCURSOR;33游标变量游标变量声明游标变量DECLARETYPEdept_curISREFCURSORRETURNdept%rowtype;cur1dept_cur;/*声明游标变量*/打开游标变量OPENcur1FORselect*fromdeptwheredeptno=10;34游标变量游标变量示例DECLARETYPEdept_curISR
13、EFCURSORRETURNdept%rowtype;cur1dept_cur;dept1dept%rowtype;BEGINOPENcur1FORselect*fromdeptwheredeptno=10;FETCHcur1INTOdept1;dbms_output.put_line(dept1.deptno|dept1.dname|dept1.loc);OPENcur1FORselect*fromdeptwheredname=SALES;FETCHcur1INTOdept1;dbms_output.put_line(dept1.deptno|dept1.dname|dept1.loc);C
14、LOSEcur1;END;35集合集合集合类似于其他第3代语言中使用的数组PL/SQL语言提供了3种不同的集合类型 联合数组(也称为索引表)嵌套表可变数组 36联合数组联合数组联合是具有Oracle的数据类型或用户自定义类型的一维体 声明联合数组的语法格式TYPEtable_typeISTABLEOFtypeINDEXBYbinary_integer;37联合数组联合数组联合数组示例DECLARETYPEemp_nameISTABLEOFvarchar2(10);/*声明类型*/INDEXBYbinary_integer;namesemp_name;/*声明变量*/BEGINnames(1):
15、=张飞;names(2):=关羽;END38嵌套表嵌套表嵌套表和联合数组类似,唯一不同是没有INDEX BY binary_integer子句 嵌套表使用前需要初始化DECLARETYPEstutabISTABLEOFvarchar2(20);stustutab:=stutab(张三,李四,王五);BEGINforiin1.3loopdbms_output.put_line(stu(i);endloop;END;39可变数组可变数组可变数组的语法格式如下:TYPEtype_nameISVARRAY|VARYINGARRAY(max_size)OFelement_typeNOTNULL40可变数
16、组可变数组可变数组也需要初始化。需要注意赋值的数量必须保证不大于可变数组的最大上限 DECLARETYPEmontharrISVARRAY(12)OFvarchar2(10);monthsmontharr:=montharr(January,February,March);BEGINmonths.extend(2);/*给months可变数组增加两个元素*/months(4):=April;months(5):=June;FORiIN1.5LOOPdbms_output.put_line(months(i);ENDLOOP;END;41OOPOOP的概念的概念自Oracle9i以来,Oracl
17、e不再是单纯的关系数据库管理系统了,它在关系数据库模型的基础上,添加了一系列面向对象的特性,其主要目的是把用户类型直接映射到数据库的类型,从而方便编程。Oracle面向对象的最基本元素是它的对象类型,也就是Type Oracle中与面向对象技术相关的数据类型主要有:对象类型,可变数组,嵌套表,对象表,对象视图等 42OOPOOP的概念的概念使用对象数据类型的优点:更容易与Java、C+编写的对象应用程序交互。获取便捷。一次对象类型请求就可以从多个关系表中获取信息,通过一次网络往复即可返回。可以把对象数据类型理解为在OOP语言中的类。创建一个对象数据类型相当于创建一个类,以后我们可以实例化,继承
18、等等 43总结总结显式游标用于处理返回一到多行结果集的select语句,显式游标首先要声明,在使用前要打开,使用完要关闭。隐式游标即简单地编码select语句。当select语句预计只返回一行时使用隐式游标。使用游标变量需要先声明引用游标类型,再定义该种类型的游标变量。它不与特定的查询绑定在一起,而是可以动态地打开不同的查询。处理结果集的方式与显式游标基本相同。集合包括:联合数组、嵌套表、可变数组,它们都是以数组的方式操纵数据,可以使用集合在PL/SQL中完成一些复杂的操作。Oracle 数据库是一种对象关系型数据库,它在关系型数据库的基础上加入了面向对象的概念 2023/3/12第 三 章
19、第四章三存储过程和函数第章企业级卓越人才培养45目标目标理解子程序的概念和作用掌握使用PL/SQL语言创建和调用存储过程和函数掌握在Java语言中调用存储过程和函数掌握事务在子程序中的应用46概述概述PL/SQL块主要有两类:命名块和匿名块匿名块(以DECLARE或BEGIN开始)每次使用都要编译,并且不能从其他地方调用命名块也叫做子程序或过程,主要有三类:存储过程函数程序包 47概述概述子程序有如下一些优点:执行速度快 提高系统性能 确保数据库的安全 允许自动执行本章主要介绍命名块结构,包括过程和函数。以及在过程(函数)应用数据库事务48存储过程存储过程主要内容创建过程调用过程过程的语法过程
20、的参数模式过程中的异常处理过程的修改和删除49创建过程创建过程如果要经常性对表实施插入操作,可以使用存储过程以提高执行效率CREATEORREPLACEPROCEDUREaddUser(p_idUsers.id%type,p_nameUsers.uname%type,p_pwdUsers.pwd%type)ASBEGINinsertintoUsers(id,uname,pwd)values(p_id,p_name,p_pwd);commit;ENDaddUser;50调用过程调用过程执行存储过程的语法格式 EXECUTEprocedure_name(parameter,n)执行存储过程插入记录
21、 SQLEXECaddUser(0001,zhangsan,zhang01);51调用过程调用过程在PL/SQL块中调用存储过程 DECLAREv_idUsers.id%type:=0002;v_nameUsers.uname%type:=lisi;v_pwdUsers.pwd%type:=li02;BEGINaddUser(v_id,v_name,v_pwd);END;52过程的语法过程的语法CREATE PROCEDURE用于创建存储过程 CREATEORREPLACEPROCEDUREschema.proc_name(parameterparameter_modedatatype,.n)
22、IS|ASlocal_declarationBEGINsql_statementEXCEPTIONexception_handlerENDprocedure_name;53过程的参数模式过程的参数模式过程的形参有三种模式:IN,OUT,IN OUTIN参数:输入型参数,IN模式的参数在传递时,实参可以是变量,也可以是常量 EXECaddUser(0001,zhangsan,zhang01);/*实参为常量*/-或者addUser(v_id,v_name,v_pwd);/*实参为变量*/54过程的参数模式过程的参数模式OUT参数:输出型参数。通过OUT参数可以在过程调用后获得一个返回值示例:/*
23、计算指定部门中,工资在1500元以上的员工人数*/CREATEPROCEDUREcountSal(p_deptnoINemp.deptno%type,/*in参数*/p_countOUTnumber/*out参数*/)ASBEGINselectcount(*)intop_countfromempwheresal=1500anddeptno=p_deptno;ENDcountSal;55过程的参数模式过程的参数模式调用带OUT参数的存储过程(实参只能是变量,不能是常量)DECLAREv_deptnoemp.deptno%type;v_countnumber;BEGINv_deptno:=&部门编
24、号;/*输入一个部门编号*/countSal(v_deptno,v_count);/*调用存储过程*/dbms_output.put_line(人数为:|v_count);END;56过程的参数模式过程的参数模式IN OUT参数:输入输出型参数。这是一种最灵活的方式,该类型是IN和OUT的组合。IN OUT参数的实参既可以传值给过程,又可以从过程获得返回值。调用时实参只能是变量,不能是常量 57过程中的异常处理过程中的异常处理为了不让存储过程因为出现异常而终止执行,可以在过程中进行异常处理 CREATEORREPLACEPROCEDUREfindEmp(p_empnoINemp.empno%t
25、ype,p_enameOUTemp.ename%type)ASBEGINselectenameintop_enamefromempwhereempno=p_empno;EXCEPTIONwhenNO_DATA_FOUNDthenp_ename:=null;END;58过程的修改和删除过程的修改和删除过程的修改,仍然使用create or replace procedure命令CREATEORREPLACEPROCEDUREcountSal(p_countOUTnumber/*out参数*/)ASBEGINselectcount(*)intop_countfromempwheresal=1500
26、;ENDcountSal;过程的删除,使用drop procedureDROPPROCEDUREcountSal;59事务处理事务处理事务是用于确保数据库的一致性事务必须满足四个原则(ACID)原子性(atomicity)一致性(consistency)隔离性(isolation)持久性(durability)60事务与存储过程事务与存储过程存储过程或许是保证事务正确的最容易、最可理解的方法 如果遵守“一个存储过程调用就是一个事务”的编程范例,可以更轻松地控制事务和建立新事务61事务与存储过程事务与存储过程示例:/*一个把资金从储蓄帐户转移到支票帐户的ATM事务*/CREATEORREPLAC
27、EPROCEDUREsavingsToChecking(p_accidnumber,/*指定帐户编号*/p_numnumber/*指定需要转帐的金额*/)ASBEGINupdateaccountssetbalance=balance-p_numwhereaccid=p_accidandtype=savings;/*资金从储蓄帐户转出*/updateaccountssetbalance=balance+p_numwhereaccid=p_accidandtype=checking;/*资金转入支票帐户*/commit;/*事务完成提交*/EXCEPTIONwhenothersthenrollba
28、ck;/*出现任何异常则回退该事务*/END;62函数函数函数是用来计算值的的一种子程序函数与过程在结构上很相似,不同的是函数有一条RETURN语句,用来返回值 63创建函数创建函数假设我们要查询一个用户zhangsan是否在Users表中存在,创建函数如下:CREATEORREPLACEFUNCTIONexistUser(p_nameUsers.uname%type)RETURNbooleanISt_countnumber;BEGINselectcount(uname)intot_countfromUserswhereuname=p_name;ift_count0thenreturntrue
29、;/*如果存在返回true*/elsereturnfalse;/*如果不存在的返回false*/endif;ENDexistUser;64函数的调用函数的调用在PL/SQL中调用函数DECLAREexistedboolean;BEGINexisted:=existUser(zhangsan);/*调用函数*/ifexistedthendbms_output.put_line(该用户存在);elsedbms_output.put_line(该用户不存在);endif;END;65函数的语法函数的语法create function命令用于创建函数CREATEORREPLACEFUNCTIONsch
30、ema.function_name/*函数名*/(parameterparameter_modedatatype,.n)/*参数定义部分*/RETURNreturn_type/*定义返回值类型*/IS|ASlocal_declaration/*局部变量声明*/BEGINfunction_body/*函数体部分*/RETURNexpression/*返回语句*/EXCEPTIONexception_handler/*异常处理部分*/ENDfunction_name;66函数与过程的比较函数与过程的比较 函数和过程都是子程序,有很多相同之处。函数和过程的区别如下:过程过程函数函数作为一个PL/SQ
31、L语句来执行作为表达式的一部分来调用可以没有RETURN语句必须包含RETURN语句可以通过参数返回一个值必须通过RETURN语句返回一个值67总结总结Oracle 子程序是命名的PL/SQL块,它存放在数据字典中,可以在不同用户和应用程序之间共享。子程序包括存储过程和函数。子程序只编译一次,并以可执行文件形式存储,因此调用过程快速而且高效。如果不考虑数据库的移植性,可以使用子程序来实现应用程序的业务逻辑。存储过程没有返回值,但可以通过OUT和IN OUT参数返回多个值。存储过程作为一条PL/SQL语句来调用。函数必须指定一个返回值,并在函数体中用RETURN语句来返回。在函数中使用OUT或I
32、N OUT参数返回多个值是一种不良的编程习惯。函数是作为PL/SQL表达式的的一部分来调用的。事务是用于确保数据库的一致性。事务把数据库从一个一致状态带到下一个一致状态。事务ACID原则:原子性、一致性、隔离性、持久性。事务处理的主要语句:commit、rollback。2023/3/12第四章四触发器第章企业级卓越人才培养目标目标1.了解触发器的概念和作用2.理解触发器的语法3.掌握DML触发器和INSTEADOF触发器的创建和应用4.了解程序包的概念和作用概述概述1.触发器(trigger)是命名PL/SQL块的第四种类型2.本章重点介绍如何创建不同类型的触发器以及讨论触发器的一些应用。另
33、外还将介绍Oracle中程序包的概念触发器简介触发器简介1.触发器是一种过程,与表关系密切,用于保护表中的数据2.当一个基表被修改(INSERT、UPDATE或DELETE)时,触发器自动执行3.触发器可实现多个表之间数据的一致性和完整性触发器语法触发器语法1.创建触发器的具体语法:CREATEORREPLACETRIGGERschema.trigger_nameBEFORE|AFTER|INSTEADOF/*定义触发器种类*/DELETEORINSERTORUPDATEOFcolumn,nONschema.table_name|view_name/*指定操作对象*/FOREACHROWWHE
34、N(condition)trigger_body创建创建DML触发器触发器1.DML触发器由DML语句激发,并且由该语句的类型决定DML触发器的类型2.可以定义DML触发器进行INSERT、UPDATE、DELETE操作3.DML触发器可以在上述操作之前或之后激发,也可以在行或语句操作上激发创建创建DML触发器触发器1.示例:实现自动更新专业统计信息的功能createorreplacetriggerUpdateMajorStatafterinsertordeleteorupdateonstudentdeclarecursorcuris/*按专业分组统计学生人数和总积分*/selectmajor
35、,count(*)ts,sum(credit)tcfromstudentgroupbymajor;begindeletefrommajor_stat;/*先删除major_stat表中的所有记录*/forrecincurloop/*将分组统计的新结果通过循环插入表中*/insertintomajor_statvalues(rec.major,rec.ts,rec.tc);endloop;end;创建创建DML触发器触发器1.在执行INSERT、UPDATE或DELETE语句时,不论该语句影响了多少行,触发器都只被触发一次,这样的触发器可以称为语句级触发器(如UpdateMajorStat)2.
36、“FOREACHROW”子句可以指定触发器是一个行级触发器创建创建DML触发器触发器1.行级触发器示例:当删除学生表student中的一条记录时,将该记录插入到quit_stu表中createorreplacetriggerstuDeletebeforedeleteonstudentforeachrow/*指定行级触发*/begininsertintoquit_stuvalues(:old.id,:old.name,:old.major,:old.credit);end;创建创建DML触发器触发器1.伪记录“:old”和“:new”“:old”代表操作完成前的旧记录“:new”代表操作完成后的
37、新记录2.在执行三种DML语句时“:old”和“:new”的存在情况触发语句触发语句:old:newINSERTNULL要插入的记录UPDATE更新前的记录更新后的记录DELETE要删除的记录NULL创建创建DML触发器触发器1.使用伪记录的例子:在emp表中调整雇员工资,要求工资只能增加不能降低createorreplacetriggerupdate_salbeforeupdateofsal/*指定当update语句修改sal列时触发*/onempforeachrowwhen(:new.sal:old.sal)/*当新的工资小于原有工资时才触发*/begin:new.sal:=:old.sa
38、l;/*新的工资赋予原来的值,即工资不变*/end;INSTEAD OF触发器触发器1.INSTEADOF触发器用于对视图的DML触发,主要用于多表联接的视图2.例:在dept和emp表上建有如下视图createorreplaceviewemp_deptasselecte.empno,e.ename,d.deptno,d.dnamefromempe,deptdwheree.deptno=d.deptno;INSTEAD OF触发器触发器1.当在emp_dept视图上执行插入操作时,能够把相应的记录插入到Dept和emp表中createorreplacetriggerinsert_emp_dep
39、tinsteadofinsertonemp_deptbegininsertintodept(deptno,dname)values(:new.deptno,:new.dname);insertintoemp(empno,ename,deptno)values(:new.empno,:new.ename,:new.deptno);end;触发器的修改与删除触发器的修改与删除1.修 改 触 发 器 的 内 容,可 以 使 用 CREATE ORREPLACE语句来实现2.禁用名为log_creations的触发器ALTERTRIGGERlog_creationsDISABLE;重新启用log_cr
40、eations触发器ALTERTRIGGERlog_creationsENABLE;触发器的修改与删除触发器的修改与删除1.删除触发器log_creationsDROPTRIGGERlog_creations;查看所有当前用户的trigger:select*fromuser_triggers;总结总结1.触发器是一种过程。触发器可实现多个表之间数据的一致性和完整性2.触发器与子程序不同,它是在事件发生时隐式(自动)触发并执行3.触发器的类型有3种:DML触发器,INSTEADOF触发器,系统触发器4.DML触发器针对INSERT、UPDATE、DELETE操作,可以在这些操作之前或之后触发。D
41、ML触发器又包括行级触发器和语句级触发器。5.INSTEADOF触发器主要用于建立在多张基表上的视图。2023/3/12第四章五数据库开发案例第章企业级卓越人才培养目标目标1.了解数据库开发的流程2.理解需求分析方法3.理解数据库逻辑结构的设计方法4.掌握在Oracle中创建表,序列,存储过程等数据库对象86需求分析需求分析1.用例描述用例描述2.详细分析功能需求,将系统中的各个功能用用例来描述。展开每个用例的细节和逻辑流程,每个用例描述应包含前置条件、主事件流、其他事件流、后置条件触发器可实现多个表之间数据的一致性和完整性。87需求分析需求分析1.数据分析数据分析2.针对对用例描述阶段的分析
42、,归纳出详细的实体。例如:用户、产品货单产品列表、订货单、出货单和状态数据等具体用例的数据。88创建创建DML触发器触发器89设计数据库设计数据库1.创建数据库用户创建数据库用户2.授权授权create user SM identified by smdefault tablespace userstemporary tablespace tempquota 50m on users;grant create session,resource to SM;90设计数据库设计数据库1.数据库逻辑结构设计和各表描述数据库逻辑结构设计和各表描述2.此阶段是将数据库对象和表一一对应,给出对应的表结构。
43、91设计数据库设计数据库1.User表(用户)字段名称数据类型长度约束描述idnumber10主键,自增用户idloginNamevarchar230notnull登录名passwordvarchar250密码namevarchar2100用户真实姓名addressvarchar2100联系地址phonevarchar250联系电话createDatedatenotnull创建日期modifyDatedate修改日期statusnumber2外键状态编号typenumber2用户类型92设计数据库设计数据库1.Product表(产品)字段名称数据类型长度约束描述idnumber10主键,自增产
44、品idcodevarchar230notnull产品编码namevarchar230产品名称unitPricenumber10产品单价specvarchar2300规格unitsvarchar210单位statenumber2外键,notnull状态编号manufacturervarchar220生产商createDatedatenotnull创建日期modifyDatedate修改日期93设计数据库设计数据库1.DHD表(订货单)字段名称数据类型长度约束描述idnumber10主键,自增订货单idhandlevarchar250notnull经手人customerIdnumber10外键,n
45、otnull客户idstatenumber2外键,notnull状态编号createDatedatenotnull创建日期modifyDatedate修改日期94设计数据库设计数据库1.CHD表(出货单)字段名称数据类型长度约束描述idnumber10主键,自增出货单iddhdldnumber2外键,notnull订货单idhandlevarchar250notnull经手人customerIdnumber10notnull客户idstatenumber2notnull状态编号createDatedatenotnull创建日期95设计数据库设计数据库1.Item表(订货单产品列表)字段名称数据
46、类型长度约束描述idnumber10主键,自增订货单产品项dhdldnumber10外键,notnull订货单idproductIdnumber10外键,notnull产品iddhlnumber10,2订货量sendDatedatenotnull发货日期createDatedatenotnull创建日期modifyDatedate修改日期statenumber2notnull状态编号96设计数据库设计数据库1.StateInfo表结构(状态数据)字段名称数据类型长度约束描述idnumber4主键状态idvaluevarchar230状态值typenumber2状态类型97设计数据库设计数据库1
47、.创建表创建表2.在分析出所有表的表结构之后,基于数据库表结构,创建相应的数据库表。98设计数据库设计数据库1.存储过程的实现存储过程的实现2.存储过程只编译一次,并以可执行文件形式存储,因此调用存储过程快速而且高效。如果不考虑数据库的移植性,可以使用存储过程来实现应用程序的业务逻辑。3.在本项目中,我们使用存储过程来实现业务逻辑。为了简化这些存储过程的管理,我们使用程序包来组织这些存储过程。例如与Users表相关的存储过程用一个用户包来组织,与product表相关的存储过程用一个产品包来组织。99设计数据库设计数据库1.存储过程的实现存储过程的实现2.存储过程只编译一次,并以可执行文件形式存
48、储,因此调用存储过程快速而且高效。如果不考虑数据库的移植性,可以使用存储过程来实现应用程序的业务逻辑。3.在本项目中,我们使用存储过程来实现业务逻辑。为了简化这些存储过程的管理,我们使用程序包来组织这些存储过程。例如与Users表相关的存储过程用一个用户包来组织,与product表相关的存储过程用一个产品包来组织。100注释说明注释说明1.系统可采用三层架构:表现层、业务逻辑层、数据持久层。表现层只是负责将业务层传递过来的数据进行显示,不对数据进行操作。业务层负责将表示层传递过来的数据进行组装,然后执行业务操作,调用数据持久层,将数据进行持久存储;同时将从数据持久层获得的数据进行处理,返回给表
49、示层进行显示。数据持久层是用来进行数据持久化操作,将业务层传来的数据存储到数据库中,也按照业务层的要求,对数据读取,返回给业务层,由业务层对数据进行支配。在本项目中对数据的存取都通过调用存储过程来实现。101总结总结1.本章通过一个销售管理系统的应用,讲述了如何在Oracle中进行系统的数据库开发。在需求分析阶段使用用例来描述系统,可以帮助我们了解系统所要实现的具体功能。2.建立数据模型(或E-R模型)可以帮助我们找到系统实现所需的数据存储及其关系。根据数据模型进行数据库逻辑结构设计,并最终转化为具体的数据库实现。3.存储过程具有高速度,高性能的优势,如果不考虑数据库的可移植性,使用存储过程来实现系统的业务逻辑是一个不错的选择。4.通过本章的例子,我们可以进一步理解数据库的开发流程,并掌握如何使用数据库存储过程来实现系统的业务逻辑。