新宾| 察哈尔右翼后旗| 潼关| 基隆| 依安| 金湖| 临湘| 会东| 罗源| 通化县| 青冈| 邵阳县| 泸西| 石景山| 天长| 饶河| 夏津| 洛川| 榆社| 隆昌| 平江| 安多| 山亭| 新竹市| 哈密| 南通| 宜兴| 仁化| 南召| 定日| 永吉| 长汀| 深圳| 乌马河| 砀山| 茶陵| 泉州| 亚东| 合江| 昌宁| 大埔| 湖南| 铁山港| 马关| 威宁| 武清| 肇东| 合川| 通榆| 错那| 芜湖县| 金平| 夹江| 红古| 青川| 沙圪堵| 易县| 桐梓| 长安| 濮阳| 碾子山| 榆树| 泾川| 武宁| 垦利| 天祝| 息烽| 肥东| 疏附| 长垣| 高淳| 咸宁| 栾城| 蒙阴| 松滋| 吉水| 弥渡| 北流| 南岳| 米泉| 昆明| 曲周| 祁连| 献县| 鼎湖| 盈江| 岢岚| 泊头| 龙州| 顺义| 珙县| 洱源| 淮北| 苗栗| 正阳| 新源| 凭祥| 垦利| 钦州| 儋州| 砀山| 河南| 东西湖| 册亨| 八一镇| 高平| 兰溪| 鄢陵| 木兰| 临夏市| 高阳| 北海| 甘谷| 双流| 罗源| 友谊| 江川| 青川| 云霄| 嘉禾| 镇康| 仪陇| 文水| 临澧| 保定| 门源| 革吉| 富平| 开平| 宁阳| 光山| 泉港| 舞钢| 大洼| 石龙| 鹰潭| 黄陂| 孟津| 商城| 青冈| 洛隆| 东阳| 沂源| 吕梁| 奉节| 剑阁| 本溪市| 三江| 遂宁| 芷江| 尉氏| 灵寿| 定襄| 盘县| 榆中| 安宁| 贵池| 商水| 巨鹿| 集安| 静宁| 邵阳市| 泗水| 肥城| 开封市| 大兴| 太仆寺旗| 蓬溪| 临县| 龙岗| 长白| 杭锦后旗| 牟平| 文山| 孝义| 枝江| 合江| 万宁| 齐齐哈尔| 大兴| 胶州| 横山| 荥经| 叶县| 涞水| 梓潼| 平乐| 潮州| 土默特左旗| 浏阳| 沾益| 安远| 怀柔| 临海| 尚志| 衡水| 东乡| 于田| 沅江| 达坂城| 涿鹿| 固安| 砚山| 新田| 武鸣| 芜湖市| 石城| 浦城| 舞阳| 赣州| 贡山| 自贡| 两当| 荆州| 苗栗| 竹溪| 延安| 林周| 蒲县| 花溪| 定州| 内黄| 黑河| 龙南| 孝感| 芦山| 涪陵| 抚州| 密山| 孝昌| 海兴| 浮梁| 资阳| 石河子| 尼勒克| 古蔺| 承德县| 瑞金| 夏津| 胶南| 瑞安| 通许| 十堰| 朔州| 商城| 辽源| 永川| 石拐| 长沙| 大邑| 白云矿| 肃南| 安泽| 清远| 乾县| 三原| 樟树| 喀什| 轮台| 东台| 九江县| 溆浦| 肥东| 从江|

彩票开奖结果 p62查询:

2018-12-12 20:54 来源:大河网

  彩票开奖结果 p62查询:

  不可否认,改革进入深水区后,剩下的都是难啃的硬骨头,有的人难免产生畏难情绪和本领恐慌。他早年因战祸颠沛流离,飘泊洋海,将情怀写就“乡愁”与“乡愁四韵”,前者广为收录在华人世界教科书,后者被谱成民歌传唱。

最后,祝广大网友身体健康,事业进步,阖家幸福!中共甘肃省委书记现在,鲁家村从原来负债150万到现在集体资产个亿,村民人均收入达到35600元。

  二是更加重视创新动力开发。在新时代,习近平总书记深刻指出,“要在全党大兴调查研究之风,推动党中央大政方针和决策部署在基层落地生根。

  以后逐渐发展队员30多人。  旅游服务质量稳中有升,行业服务持续优化。

霍邱县回复网友关于垃圾整治问题时表示,为了打赢农村“三大”革命,将实现全县垃圾治理全覆盖。

  可以说,明面上的违规违纪少了,但隐形变异的“四风”却在潜滋暗长,违规报销巧立名目、送礼收礼藏身网上、“嘴上腐败”纷纷转入“地下”,“四风”问题树倒根存,作风建设依然任重道远。

  ”1901年,他出任步兵第一协统领后,常有宗亲族人请求谋差,王士珍均婉言谢绝,有一次,王士珍的堂弟通过王士珍的夫人私下写了一封推荐信,王士珍知道后大怒,痛斥夫人,同时告诫宗亲族人以此为戒。全国31省区市将陆续进入“两会时间”。

  (责编:程宏毅、常雪梅)

  “其本质是实现互联网上与停车相关的要素、资源及其关联服务、衍生服务,能互联互通、广泛共享、有效聚合和充分释放。  让文物活起来,需要让文化走进人们生活。

  在我们展开讲下去之前,先给大家看一副对联:云朝朝朝朝朝朝朝朝散潮长长长长长长长长消看到这副对联后你现在的状态是不是“一脸懵”?莫慌,先看文章,我们会在文末公布答案。

  正所谓,前事不忘,后事之师。

  ”那名被打的文案亲信,和王士珍一样,也是穷人家庭出身,由于文笔很好,深得王士珍的信任,在被打了100军棍后,觉得没脸见人,于是收拾行囊,连夜不辞而别。这说明,在国家治理体系和治理能力现代化建设的大背景下,机关事务部门提供的保障工作,必须根据法律规定和制度标准展开,即必须在法治的轨道上进行。

  

  彩票开奖结果 p62查询:

 
责编:
关闭

关闭

关闭

封号提示

内容

首页 第14章PLSQL程序设计

第14章PLSQL程序设计.ppt

第14章PLSQL程序设计

烟雨梦兮 2018-12-12 评分 0 浏览量 0 0 0 0 暂无简介 简介 举报
【网民留言仅代表作者个人意见,不代表人民网观点】留言方式:

简介:本文档为《第14章PLSQL程序设计ppt》,可适用于IT/计算机领域,主题内容包含大型数据库系统*第章PLSQL程序设计东北大学东软信息学院计算机系东北大学东软信息学院计算机系*大型数据库系统*本章内容PLSQL概述PLSQL基础符等。

大型数据库系统*第章PLSQL程序设计东北大学东软信息学院计算机系东北大学东软信息学院计算机系*大型数据库系统*本章内容PLSQL概述PLSQL基础控制结构游标异常处理存储子程序包触发器东北大学东软信息学院计算机系*大型数据库系统*本章要求掌握PLSQL程序设计基础知识掌握存储过程、函数、包、触发器的应用大型数据库系统*PLSQL概述PLSQL特点PLSQL功能特性PLSQL执行过程与开发工具大型数据库系统*为什么需要PLSQLPLSQL:针对ORACLE的编程语言SQL语言的缺点:仅限于数据库的操作没有逻辑控制结构无法实现复杂的数据结构、算法无法进行复杂的业务逻辑。编程语言SQL?高级语言:C(Java)SQL脚本语言:PHP(ASP)SQL东北大学东软信息学院计算机系*大型数据库系统*“编程语言SQL”的缺点exec(‘select*fromtbMath’)for(每条记录){if(’女’){exec(updatesetxx=‘…’whereid=‘…’)}elseif(’男’){exec(updatesetxx=‘…’whereid=‘…’)}}修改学生数学成绩:女生加分男生加分。大型数据库系统*客户端Oracleupdate…大型数据库系统*普通程序执行过程普通程序执行过程客户端通过网络发送select语句到OracleOracle编译、执行该语句Oracle将查询结果网络发送到客户端客户端逐条判断查询结果逐条发送update语句Oracle通过网络接收update语句编译、执行客户端Oracle条Selectn条update:编译、执行Oracle客户端:条查询结果n条更新结果:其中查询结果数据量可能很大且通常需要网络传输普通数据库程序:程序执行效率差大型数据库系统*客户端Oracle东北大学东软信息学院计算机系*大型数据库系统*PLSQL执行过程PLSQL程序:只进行一次网络传输在ORACLE端编译执行过程在服务器端进行。程序执行过程中:不需要网络传输不占用客户端资源:CPU、内存编译:PLSQL程序分两类普通程序:一次编译存储过程:预编译执行时不需要编译东北大学东软信息学院计算机系*大型数据库系统*PLSQL特点服务器端程序(存储过程):永久驻留在服务器端减小网络流量提高应用程序的运行性能。可移植性好:只限于Oracle专门针对ORACLE的程序设计用结束形参赋给实参。在过程内该参数可读可写。参数模式:实参、形参大型数据库系统*参数限制必须至少有一个参数不能定义形参的长度、精度或刻度createprocedureProc(penamevarchar())createprocedureProc(penamevarchar)东北大学东软信息学院计算机系*大型数据库系统*创建一个过程以部门号为参数查询该部门的平均工资并输出该部门中比平均工资高的员工号、员工名。CREATEORREPLACEPROCEDUREshowemp(pdeptnoempdeptnoTYPE)ASvsalempsalTYPEBEGINSELECTavg(sal)INTOvsalFROMempWHEREdeptno=pdeptnoDBMSOUTPUTPUTLINE(pdeptno||''||'averagesalaryis:'||vsal)FORvempIN(SELECT*FROMempWHEREdeptno=pdeptnoANDsal>vsal)LOOPDBMSOUTPUTPUTLINE(vempempno||''||vempename)ENDLOOPEXCEPTIONWHENNODATAFOUNDTHENDBMSOUTPUTPUTLINE('Thedepartmentdoesn’’texists!')ENDshowemp大型数据库系统*创建一个过程以部门号为参数返回该部门的人数和最高工资。CREATEORREPLACEPROCEDUREreturndeptinfo(pdeptnoempdeptnoTYPE,pavgsalOUTempsalTYPE,pcountOUTempsalTYPE)ASBEGINSELECTmax(sal),count(*)INTOpavgsal,pcountFROMempWHEREdeptno=pdeptnoEXCEPTIONWHENNODATAFOUNDTHENDBMSOUTPUTPUTLINE('Thedepartmentdon’’texists!')ENDreturndeptinfo大型数据库系统*过程的调用在PLSQL程序中调用BEGINprocedurename(parameterlist)END在SQL*PLUS中调用EXECUTEprocedurename(parameterlist)储存过程是全局的存储过程是全局的可以调用别人写的存储过程大型数据库系统*SQL*Plus调用存储过程无输出参数:SQL>EXECshowemp()有输出参数:SQL>VARIABLEMYPARAVARCHAR():='INPARA'SQL>VARIABLEMYPARANUMBERSQL>EXECMYPROCEDURE(:MYPARA,:MYPARA)绑定变量大型数据库系统*DECLAREvavgsalempsalTYPEvcountNUMBERBEGINshowemp()returndeptinfo(,vavgsal,vcount)DBMSOUTPUTPUTLINE(vavgsal||''||vcount)ENDPLSQL程序中调用存储过程大型数据库系统*存储过程的管理修改存储过程CREATEORREPLACEPROCEDURE重新编译存储过程ALTERPROCEDUREprocedurenameCOMPILE删除存储过程DROPPROCEDUREprocedurename名查看过程源代码SELECTTEXTFROMUSERSOURCEWHERENAME=PROCEDURENAME大型数据库系统*通常过程不需要返回值如果只返回一个值也可以通过函数实现。如果希望返回多个值可以使用OUT或INOUT模式的参数来实现。东北大学东软信息学院计算机系*大型数据库系统*函数函数=只有一个返回值的过程函数的创建函数的调用函数的管理大型数据库系统*(存储)函数概述相对于过程函数必须有一个显式的返回值。一个函数中至少必须包含一个RETURN语句可以有多个RETURN:但只能有一个被执行如果需要返回多个值?大型数据库系统*CREATEORREPLACEFUNCTIONfunctionname(parameternamemodedatatypeDEFAULT|:=value,parameternamemodedatatypeDEFAULT|:=value,…)RETURNreturndatatypeAS|IS*Declarativesectionishere*BEGIN*Executablesectionishere*EXCEPTION*Exceptionsectionishere*ENDfunctionname函数的创建大型数据库系统*创建一个以部门号为参数返回该部门最高工资的函数。CREATEORREPLACEFUNCTIONreturnmaxsal(pdeptnoempdeptnoTYPE)RETURNempsalTYPEASvmaxsalempsalTYPEBEGINSELECTmax(sal)INTOvmaxsalFROMempWHEREdeptno=pdeptnoRETURNvmaxsalEXCEPTIONWHENNODATAFOUNDTHENDBMSOUTPUTPUTLINE('Thedeptnoisinvalid!')ENDreturnmaxsal大型数据库系统*函数的调用过程调用可以是一个独立的PLSQL语句而函数调用只能是PLSQL表达式的一部分函数调用不能是一个单独的语句过程则可以。在SQL语句中调用函数在PLSQL中调用函数大型数据库系统*DECLAREvsalempsalTYPEBEGINFORvdeptIN(SELECTDISTINCTdeptnoFROMemp)LOOPreturnmaxsal(vdeptdeptno)vsal:=returnmaxsal(vdeptdeptno)DBMSOUTPUTPUTLINE(vdeptdeptno||''||vsal)ENDLOOPEND在PLSQL程序中大型数据库系统*在SQL*Plus中selectreturnmaxsal()fromdual大型数据库系统*Dual表dual是一个虚拟表用来构成select的语法规则oracle保证dual里面永远只有一条记录。查看当前用户selectuserfromdual调用系统函数例如获得当前系统时间:selecttochar(sysdate,'yyyymmddhh:mi:ss')fromdual得到序列的值: selectyoursequencenextvalfromdual用做计算器:select*fromdual大型数据库系统*函数的管理修改函数CREATEORREPLACEFUNCTIONfunctionname重新编译存储过程ALTERFUNCTIONfunctionnameCOMPILE删除存储过程DROPFUNCTIONfunctionname查看过程源代码selecttextfromusersourcewherename=functionname大型数据库系统*局部子程序局部子程序:嵌套在其他PLSQL块中的子程序(过程和函数)。先声明后使用:如果子程序间相互调用则需采用预先声明只在当前块内有效:不能在其父块外被调用。使用局部子程序时需要注意:局部子程序必须在PLSQL块声明部分的最后进行定义局部子程序可以重载。大型数据库系统*在一个块内部定义一个函数和一个过程:函数以部门号为参数返回该部门的平均工资过程以部门号为参数输出该部门中工资低于部门平均工资的员工的员工号、员工名。大型数据库系统*DECLAREvdeptnoempdeptnoTYPEvavgsalempsalTYPEFUNCTIONreturnavgsal(pdeptnoempdeptnoTYPE)RETURNempsalTYPEASvsalempsalTYPEBEGINSELECTavg(sal)INTOvsalFROMempWHEREdeptno=pdeptnoRETURNvsalENDreturnavgsal大型数据库系统*PROCEDUREshowemp(pdeptnoempdeptnoTYPE)ASCURSORcempISSELECT*FROMempWHEREsal<returnavgsal(pdeptno)BEGINFORvempINcempLOOPDBMSOUTPUTPUTLINE(vempempno||''||vempename)ENDLOOPENDshowempBEGINvdeptno:=xvavgsal:=returnavgsal(vdeptno)showemp(vdeptno)END大型数据库系统*存储子程序与局部子程序区别在于:存储子程序不能重载而局部子程序可以进行重载存储子程序编译后放在服务器端可以直接调用而局部子程序存在于定义它的块中在运行时可能需要编译局部子程序只能在定义它的块中使用。大型数据库系统*在一个PLSQL块中重载两个过程:第一个以员工号为参数输出员工信息另一个以员工名为参数输出员工信息。利用这两个过程分别查询:员工号为的员工信息员工名为SMITHFORD的员工信息。大型数据库系统*DECLAREPROCEDUREshowempinfo(pempnoempempnoTYPE)ASvempempROWTYPEBEGINSELECT*INTOvempFROMempWHEREempno=pempnoDBMSOUTPUTPUTLINE(vempename||''||vempdeptno)EXCEPTIONWHENNODATAFOUNDTHENDBMSOUTPUTPUTLINE('Thereisnotsuchanemployee!')ENDshowempinfo大型数据库系统*PROCEDUREshowempinfo(penameempenameTYPE)ASvempempROWTYPEBEGINSELECT*INTOvempFROMempWHEREename=penameDBMSOUTPUTPUTLINE(vempempno||''||vempdeptno)EXCEPTIONWHENNODATAFOUNDTHENDBMSOUTPUTPUTLINE('Thereisnotsuchanemployee!')WHENTOOMANYROWSTHENDBMSOUTPUTPUTLINE('Therearemorethanoneemployee!')ENDshowempinfo大型数据库系统*BEGINshowempinfo()showempinfo()showempinfo('SMITH')showempinfo('FORD')END大型数据库系统*存储子程序局部子程序可重载?否是整个数据库可用?(全局性)是否编译时机当前块创建时父块创建时大型数据库系统*包包概述包的创建包的调用包的重载包的初始化包的管理大型数据库系统*包概述包是局部子程序(过程、函数)和变量的容器(集合)类似于一个简化的面向对象语言中的类包是全局的在数据库中独立存储作用:将需要共享的相关内容集中在一起提高软件的模块化程度。包类型数据库内置包用户创建的包大型数据库系统*包头和包体中都可以定义过程、函数、游标、类型、异常和变量等包头中声明的内容是公开的(PUBLIC)过程和函数只包括原型不能包含任何实现代码。包体中声明的内容是私有的(PRIVATE)必须包含包头中声明的过程和函数的实现代码。私有元素只能由同一包体中其他过程和函数使用。包=包规范(包头)包体大型数据库系统*包头:声明共享的内容语法CREATEORREPLACEPACKAGEpackagenameIS|ASPRAGMASERIALLYRESUABLEtypedefinition|variabledeclaration|exceptiondeclaration|cursordeclaration|proceduredeclaration|functiondeclarationENDpackagename大型数据库系统*注意:所有元素都是可选的:过程、函数、游标、类型、异常和变量元素声明的顺序可以是任意的但必须先声明后使用过程和函数的声明只包括原型不包括具体实现代码。大型数据库系统*创建一个包包括个变量、个过程和个异常。CREATEORREPLACEPACKAGEpkgempASminsalNUMBERmaxsalNUMBERebeyondboundEXCEPTIONPROCEDUREupdatesal(pempnoNUMBER,psalNUMBER)PROCEDUREaddemployee(pempnoNUMBER,psalNUMBER)ENDpkgemp大型数据库系统*包体语法CREATEORREPLACEPACKAGEBODYpackagenameIS|ASPRAGMASERIALLYRESUABLEtypedefinition|variabledeclaration|exceptiondeclaration|cursordeclaration|proceduredefinition|functiondefinitionENDpackagename包体:函数和过程的实现大型数据库系统*注意:必须先创建包头再创建包体如果包头中不包含任何函数或过程则可以不创建包体。包体中函数和过程的原型必须与包头中的声明完全一致大型数据库系统*CREATEORREPLACEPACKAGEBODYpkgempASPROCEDUREupdatesal(pempnoNUMBER,psalNUMBER)ASBEGINSELECTmin(sal),max(sal)INTOminsal,maxsalFROMempIFpsalBETWEENminsalANDmaxsalTHENUPDATEempSETsal=psalWHEREempno=pempnoIFSQLNOTFOUNDTHENRAISEAPPLICATIONERROR(,'Theemployeedoesn''texist')ENDIFELSERAISEebeyondboundENDIFEXCEPTIONWHENebeyondboundTHENDBMSOUTPUTPUTLINE('Thesalaryisbeyondbound!')ENDupdatesal大型数据库系统*PROCEDUREaddemployee(pempnoNUMBER,psalNUMBER)ASBEGINSELECTmin(sal),max(sal)INTOminsal,maxsalFROMempIFpsalBETWEENminsalANDmaxsalTHENINSERTINTOemp(empno,sal)VALUES(pempno,psal)ELSERAISEebeyondboundENDIFEXCEPTIONWHENebeyondboundTHENDBMSOUTPUTPUTLINE('Thesalaryisbeyondbound!')ENDaddemployeeENDpkgemp大型数据库系统*包的调用包元素的作用域:包内容的有效范围。在包头部(包规范)声明的任何元素是公有的在包外都是可见的。包外:通过packageelement形式调用包内:直接通过元素名进行调用。在包体中定义而没有在包头中声明的元素是私有的只能在包体中引用。大型数据库系统*实现一个PLSQL程序调用包pkgemp中的过程updatesal修改员工工资为。调用addemployee添加一个员工号为工资为的员工。BEGINpkgempupdatesal(,)pkgempaddemployee(,)END大型数据库系统*ORACLE内置包DBMSOUTPUT包:在调试PLSQL程序时使用该程序包Oracle不推荐使用该包来做报表输出或其他格式化输出之用。DBMSOUTPUTPUTLINE:将一行信息放到buffer中DISABLE:禁用消息输出ENABLE:启用消息输出GETLINE:从buffer中获取单行信息GETLINES:从buffer中获取多行信息PUT:将信息放到buffer中(不换行)NEWLINE:终结由PUT过程所创建的一行大型数据库系统*包允许重载重载子程序必须名称相同参数不同。如果两个子程序只是参数名称和模式不同则不能重载。PROCEDUREoverloadme(parameterINNUMBER)PROCEDUREoverloadme(parameterOUTNUMBER)不能根据两个函数返回类型不同对它们进行重载。FUNCTIONoverloadmeRETURNDATEFUNCTIONoverloadmeRETURNNUMBER重载子程序参数必须属于不同的类型系列。PROCEDUREoverloadchar(parameterINCHAR)PROCEDUREoverloadchar(parameterINVARCHAR)大型数据库系统*在一个包中重载两个过程分别以部门号和部门名称为参数查询相应部门员工名、员工号信息。大型数据库系统*CREATEORREPLACEPACKAGEpkgoverloadASPROCEDUREshowemp(pdeptnoNUMBER)PROCEDUREshowemp(pdnameVARCHAR)ENDpkgoverloadCREATEORREPLACEPACKAGEBODYpkgoverloadASPROCEDUREshowemp(pdeptnoNUMBER)ASBEGINFORvempIN(SELECT*FROMempWHEREdeptno=pdeptno)LOOPDBMSOUTPUTPUTLINE(vempempno||''||vempename)ENDLOOPENDshowemp大型数据库系统*PROCEDUREshowemp(pdnameVARCHAR)ASvdeptnoNUMBERBEGINSELECTdeptnoINTOvdeptnoFROMdeptWHEREdname=pdnameFORvempIN(SELECT*FROMempWHEREdeptno=vdeptno)LOOPDBMSOUTPUTPUTLINE(vempempno||''||vempename)ENDLOOPENDshowempENDpkgoverload大型数据库系统*包的初始化某个会话中包在第一次被调用时装入内存并在整个会话期间保持。包:只能实例化一次的类!在第一次被调用时可以自动执行一个初始化过程。包的初始化过程:一次性过程。作用类似于构造函数。它是一个匿名的PLSQL块在包体结构的最后以BEGIN开始。大型数据库系统*在pkgemp包中可以在包初始化时给minsal和maxsal两个变量赋值而在子程序中直接引用这两个变量。CREATEORREPLACEPACKAGEpkgempASminsalNUMBERmaxsalNUMBERebeyondboundEXCEPTIONPROCEDUREupdatesal(pempnoNUMBER,psalNUMBER)PROCEDUREaddemployee(pempnoNUMBER,psalNUMBER)ENDpkgemp大型数据库系统*CREATEORREPLACEPACKAGEBODYpkgempASPROCEDUREupdatesal(pempnoNUMBER,psalNUMBER)ASBEGINIFpsalBETWEENminsalANDmaxsalTHENUPDATEempSETsal=psalWHEREempno=pempnoIFSQLNOTFOUNDTHENRAISEAPPLICATIONERROR(,‘Employeenotexist')ENDIFELSERAISEebeyondboundENDIFEXCEPTIONWHENebeyondboundTHENDBMSOUTPUTPUTLINE('Thesalaryisbeyondbound!')ENDupdatesal大型数据库系统*PROCEDUREaddemployee(pempnoNUMBER,psalNUMBER)ASBEGINIFpsalBETWEENminsalANDmaxsalTHENINSERTINTOemp(empno,sal)VALUES(pempno,psal)ELSERAISEebeyondboundENDIFEXCEPTIONWHENebeyondboundTHENDBMSOUTPUTPUTLINE('Thesalaryisbeyondbound!')ENDaddemployeeBEGINSELECTmin(sal),max(sal)INTOminsal,maxsalFROMempENDpkgemp大型数据库系统*包的管理包的修改CREATEORREPLACEPACKAGE包名重新编译整个包:ALTERPACKAGEpackagenameCOMPILE包头:ALTERPACKAGEpackagenameCOMPILESPECIFICATION包体:ALTERPACKAGEpackagenameCOMPILEBODY删除包DROPPACKAGEpackagenameDROPPACKAGEBODYpackagename大型数据库系统*查看包源代码SELECTTEXTFROMUSERSOURCEWHERENAME=‘EMPPACKAGE’ANDTYPE=‘PACKAGE’大型数据库系统*触发器触发器概述DML触发器INSTEADOF触发器系统触发器触发器的管理大型数据库系统*触发器概述触发器的概念触发器是命名块的一种。当预先定义的事件发生时由系统自动执行。触发器不接受任何参数大型数据库系统*触发器(TRIGGER)作用维护那些通过创建表时的声明约束难以实现的复杂的完整性约束(利用外键、CHECK约束无法实现):DML触发器例如:禁止降低员工工资审计(记录已进行的改变及是谁进行了该项改变):系统触发器例如:监控一个表中的信息。可以用来发布各种事件的信息。东北大学东软信息学院计算机系*大型数据库系统*触发器类型DML触发器:INSERT、DELETE、UPDATE系统触发器数据库启动或关闭之类的系统事件发生时触发在执行诸如创建表之类的DDL操作时触发INSTEADOF触发器:专门针对视图的触发器大型数据库系统*触发器语法:触发器头触发器体创建参数:whowhenwhat作用对象:表、视图、数据库、模式触发事件:DML、DDL、数据库系统事件触发时机:BEFORE、AFTER触发级别:语句级、行级触发条件:WHEN条件触发操作:SQL语句、PLSQL块东北大学东软信息学院计算机系*大型数据库系统*DML触发器每一个表上可以建立多个不同类型的DML触发器。DML触发器的种类以及执行顺序语句级前触发器行级前触发器DML操作(触发事件)例如:执行对EMP表的UPDATE操作行级后触发器语句级后触发器大型数据库系统*创建DML触发器CREATEORREPLACETRIGGERtriggernameBEFORE|AFTERtriggeringeventOFcolumnnameONtablenameFOREACHROWWHENtriggerconditionDECLARE*Declarativesectionishere*BEGIN*Exccutablesectionsihere*EXCEPTION*Exceptionsectionishere*ENDtriggername大型数据库系统*创建一个触发器禁止在休息日改变雇员信息CREATEORREPLACETRIGGERTRSECEMPBEFOREINSERTORUPDATEORDELETEONEMPBEGINIFTOCHAR(SYSDATE,'DY')IN('星期六','星期日')THENRAISEAPPLICATIONERROR(,‘不能在休息日修改员工信息')ENDIFEND东北大学东软信息学院计算机系*大型数据库系统注意:before触发器执行后引起触发器的原操作还需要执行吗?YES!如何使原操作终止?抛出一个异常*大型数据库系统*判断当前执行的触发器到底是由那种DML操作激发的。谓词行为INSERTING如果触发语句是INSERT则为TRUE否则为FALSEUPDATING如果触发语句是UPDATE则为TRUE否则为FALSEDELETING如果触发语句是DELETE则为TRUE否则为FALSE大型数据库系统*为emp表创建一个触发器:当执行插入操作时显式加入新员工后的员工人数当执行更新操作时显式更新后员工平均工资当执行删除操作时显式删除后各个部门的人数。大型数据库系统*CREATEORREPLACETRIGGERtrgempdmlAFTERINSERTORUPDATEORDELETEONempDECLAREvcountNUMBERvsalNUMBER(,)BEGINIFINSERTINGTHENSELECTcount(*)INTOvcountFROMempDBMSOUTPUTPUTLINE(vcount)ELSIFUPDATINGTHENSELECTavg(sal)INTOvsalFROMempDBMSOUTPUTPUTLINE(vsal)ELSEDELETINGFORvdeptIN(SELECTdeptno,count(*)numFROMempGROUPBYdeptno)LOOPDBMSOUTPUTPUTLINE(vdeptdeptno||''||vdeptnum)ENDLOOPENDIFENDtrgempdml可以改成三个触发器东北大学东软信息学院计算机系*大型数据库系统*CREATEORREPLACETRIGGERtrgempdeleteAFTERDELETEONempBEGINFORvdeptIN(SELECTdeptno,count(*)numFROMempGROUPBYdeptno)LOOPDBMSOUTPUTPUTLINE(vdeptdeptno||''||vdeptnum)ENDLOOPENDtrgempdelete东北大学东软信息学院计算机系*大型数据库系统*行触发器:执行DML操作时每操作一个记录触发器就执行一次一个DML操作涉及到多少个记录触发器就执行多少次。deletefromempwheredeptno=在行级触发器中可以使用WHEN条件进一步控制触发器的执行时机。在触发器体中可以对当前操作的记录进行访问和操作。行触发器东北大学东软信息学院计算机系*大型数据库系统*标识符:行的原始值和新的值:OLD:NEW引用方式::oldfield和:newfield(执行部分)oldfield和newfield(WHEN条件中)在不同操作中的意义引用当前操作的记录触发语句:old:newINSERT未定义插入的新值UPDATE更新前的原始值更新后的值DELETE被删除的原始值未定义大型数据库系统*为emp表创建一个触发器:当插入新员工时显示新员工的员工号、员工名当更新员工工资时显示修改前后员工工资当删除员工时显示被删除的员工号、员工名。注意:一个DML语句可能修改多个记录大型数据库系统*CREATEORREPLACETRIGGERtrgempdmlrowBEFOREINSERTORUPDATEORDELETEONempFOREACHROWBEGINIFINSERTINGTHENDBMSOUTPUTPUTLINE(:newempno||''||:newename)ELSIFUPDATINGTHENDBMSOUTPUTPUTLINE(:oldsal||''||:newsal)ELSEdeletingDBMSOUTPUTPUTLINE(:oldempno||''||:oldename)ENDIFENDtrgempdmlrow大型数据库系统*在行触发器中进一步控制触发器的执行条件:使用WHEN(!)子句。修改工资时保证修改后的工资高于修改前的工资。CREATEORREPLACETRIGGERtrgempupdaterowBEFOREUPDATEOFsalONempFOREACHROWWHEN(newsal<oldsal)BEGINRAISEAPPLICATIONERROR(,'Thesalaryislower!')ENDtrgempupdaterow大型数据库系统*修改员工工资时如修改后的工资低于修改前的工资则将修改后的工资改为修改前工资加。CREATEORREPLACETRIGGERtrgempupdaterowBEFOREUPDATEOFsalONempFOREACHROWWHEN(newsal<oldsal)BEGIN:newsal:=:oldsalENDtrgempupdaterow大型数据库系统*修改员工工资时如修改后的工资低于修改前的工资则将修改后的工资改为修改前工资加。CREATEORREPLACETRIGGERtrgempupdaterowBEFOREUPDATEOFsalONempFOREACHROWBEGINIF(:newsal<:oldsal):newsal:=:oldsalENDifENDtrgempupdaterow大型数据库系统*不能以整个记录进行赋值或引用不能作为参数传递给带triggeringtableROWTYPE的过程和函数如果触发器是建立在嵌套表上:old和:new都执行嵌套表的行:parent指向父表中的当前行。:OLD和:NEW伪记录类型变量大型数据库系统*创建一个触发器在修改dept表的部门号时同时更新emp表中相应的员工的部门号。CREATEORREPLACETRIGGERTRUPDATEDEPTAFTERUPDATEOFDEPTNOONDEPTFOREACHROWBEGINUPDATEEMPSETDEPTNO=:NEWDEPTNOWHEREDEPTNO=:OLDDEPTNOEND大型数据库系统触发器和完整性检查的时机语句级BEFORE触发器(行触发器)对于每一行:行级BEFORE触发器执行DML语句进行当前行的完整性检查(主键、check)行级AFTER触发器对从表进行当前行的完整性检查(外键)语句级AFTER触发器大型数据库系统*INSTEADOF触发器只能定义在视图上的触发器INSTEADOF触发器只能是行级触发器INSTEADOF触发器由DML操作激发而DML操作本身并不执行作用修改一个本来不可以修改的视图修改视图中某嵌套表列的列东北大学东软信息学院计算机系*大型数据库系统*创建INSTEADOF触发器的基本语法CREATEORREPLACETRIGGERtriggernameINSTEADOFtriggeringeventOFcolumnnameONviewnameFOREACHROWWHENtriggerconditionDECLARE*Declarativesectionishere*BEGIN*Exccutablesectionsihere*EXCEPTION*Exceptionsectionishere*ENDtriggername大型数据库系统*如果视图中包含下列任何一项则该视图不可修改集合操作符聚集函数GROUPBY、CONNECTBY或STARTWITH子句DISTINCT(部分)包含连接的视图在视图上可以进行DML吗?大型数据库系统*INSTEADOF示例创建视图EMPDEPT其中包含员工及其所在部门所有信息并向视图中插入一条记录。创建视图CREATEORREPLACEVIEWEMPDEPTASSELECTEMPNO,ENAME,SAL,DNAMEFROMEMP,DEPTWHEREEMPDEPTNO=DEPTDEPTNOWITHCHECKOPTIONSELECT*FROMEMPDEPTINSERTINTOEMPDEPTVALUES(,’TOM’,,’SALES’)大型数据库系统*CREATEORREPLACETRIGGERtrigviewINSTEADOFINSERTONempdeptFOREACHROWDECLAREvdeptnodeptdeptnotypeBEGINSELECTdeptnoINTOvdeptnoFROMdeptWHEREdname=:newdnameINSERTINTOemp(empno,ename,sal,deptno)VALUES(:newempno,:newename,:newsal,vdeptno)ENDtrigview大型数据库系统*系统触发器触发器事件创建系统触发器大型数据库系统*系统触发器事件系统触发器事件DDL事件CREATE、ALTER、DROP数据库事件触发服务器启动关闭、用户登陆注销以及服务器错误大型数据库系统*事件时机描述STARTUPAFTER当实例开始时激发SHUTDOWNBEFORE当实例关闭时激发SERVERERRORAFTER只要错误发生就激发LOGONAFTER在一个用户成功连接数据库时触发LOGOFFBEFORE在用户注销时开始激发CREATEBEFORE,AFTER创建一个模式对象之前或之后激发DROPBEFORE,AFTER在删除一个模式对象之前或之后激发ALTERBEFROE,AFTER在更改一个模式对象之前或之后激发大型数据库系统*创建系统触发器的语法CREATEORREPLACETRIGGERtriggernameBEFORE|AFTERddleventlist|databaseeventlistONDATABASE|SCHEMAWHENtriggerconditionDECLARE*Declarativesectionishere*BEGIN*Executablesectionishere*EXCEPTION*Exceptionsectionishere*ENDtriggername大型数据库系统*创建系统触发器示例基于DDL事件触发器:模式(用户)级基于数据库事件的触发器:数据库级大型数据库系统*系统触发器级别(DATABASE、SCHEMA)触发事件发生数据库级别的触发器就会激发。只有触发事件在指定模式中发生时模式级别的触发器才会激发。如果没有指定SCHEMA缺省为拥有该触发器的模式。事件属性函数:SYS用户拥有的PLSQL函数。可以返回触发器事件信息引用事件属性函数必须用SYS作为其前缀大型数据库系统*将每个用户的登录信息写入到temptable表中。CREATEORREPLACETRIGGERloguserconnectionAFTERLOGONONDATABASEBEGININSERTINTOscotttemptableVALUES(USER,SYSDATE)ENDloguserconnection大型数据库系统*当数据库中发生CREATE事件时将创建的对象信息记录到ddlcreations表中。CREATETABLEddlcreations(useridVARCHAR(),objecttypeVARCHAR(),objectnameVARCHAR(),objectownerVARCHAR(),creationdateDATE)CREATEORREPLACETRIGGERlogcreationsAFTERCREATEONDATABASEBEGININSERTINTOddlcreationsVALUES(USER,SYSDICTIONARYOBJTYPE,SYSDICTIONARYOBJNAME,SYSDICTIONARYOBJOWNER,SYSDATE)ENDlogcreations大型数据库系统*触发器的管理不能出现任何事务控制语句:触发器作为触发语句的一部分处于同一个事务中。触发器体所调用的过程或函数都不能发出任何事务控制语句触发器的大小不能超过K。触发器体中不能声明LONG或LONGRAW变量而且:new和:old不能引用LONG或LONGRAW类型的列。触发器体中可以引用LOB和OBJECT列但不能修改该列的值。东北大学东软信息学院计算机系*模式对象都不能重名大型数据库系统*修改触发器CREATEORREPLACETRIGGERtriggername重新编译触发器ALTERTRIGGERtriggernameCOMPILE禁用、启用触发器ALTERTRIGGERtriggernameDISALBLE|ENABLE禁用、启用某个表相关的所有触发器:ALTERTABLEtablenameDISABLE|ENABLEALLTRIGGERS删除触发器DROPTRIGGERtriggername大型数据库系统*小结PLSQL概述PLSQL基础控制结构游标异常处理存储子程序包触发器大型数据库系统*updateempesetesal=(selectavg(sal)fromemppwhereedeptno=pdeptno)大型数据库系统*实验课考试开卷、笔试题型SQL语言:分*连接嵌套查询PLSQL:分*行触发器游标循环、分支异常处理大型数据库系统*Scott模式下的两个表员工表信息EMP名称为空?类型约束说明EMPNONOTNUMBER()PKEMP员工号ENAMEVARCHAR()?员工姓名JOBVARCHAR()?职位MGRNUMBER()?直接上级员工号HIREDATEDATE?雇用日期SALNUMBER(,)?工资COMMNUMBER(,)?奖金DEPTNONUMBER()FKDEPT部门编号大型数据库系统*员工岗位:clerk,salesman,manager,president…大型数据库系统*部门信息表DEPTScott模式下的两个表字段名称是否为空类型约束说明DEPTNONOTNUMBER()PKDEPT部门编号DNAMEVARCHAR()部门名称LOCVARCHAR()所在地大型数据库系统*程序开发的基本过程scott登录……如何输入?如何输出?xDBMSOUTPUT||setserveroutputon基本语法:判断、循环游标异常处理行DML触发器大型数据库系统*无需定义循环变量无需定义游标查询结果可以是多行BEGINFORvempIN(select*fromempwheredeptno=)LOOPDBMSOUTPUTPUTLINE(vempempno||''||vempename)ENDLOOPEND隐式FOR游标大型数据库系统*预定义的异常异常情况名错误代码描述CURSORALREADYOPENORA尝试打开已经打开的游标INVALIDCURSORORA不合法的游标操作(如要打开已经关闭的游标)NODATAFOUNDORA没有发现数据(SELECTINTO)TOOMANYROWSORA返回了多行数据(SELECTINTO)INVALIDNUMBERORA转换成数字失败(‘X’)VALUEERRORORA截断、算法或转换错误通常出现在赋值错误ZERODIVIDEORA除数为ROWTYPEMISMATCHORA主机游标变量与PLSQL游标变量类型不匹配大型数据库系统*如何判定字符串是合法数字?DECLAREVINPUTVARCHAR():='AB'VEMPNONUMBERVEMPEMPROWTYPEBEGINVEMPNO:=TONUMBER(VINPUT)SELECT*INTOVEMPFROMEMPWHEREEMPNO=VINPUTVALUEERRORINVALIDNUMBER大型数据库系统*EXCEPTIONWHENVALUEERRORTHENDBMSOUTPUTPUTLINE(‘不是数字')WHENINVALIDNUMBERTHENDBMSOUTPUTPUTLINE(‘不是数字')END大型数据库系统*查询名为SMITH的员工工资如该员工不存在则输出“Thereisnotsuchanemployee!”如存在多个同名的员工则输出所有员工号和工资。DECLAREvsalempsaltypeBEGINSELECTsalINTOvsalFROMempWHEREename='SMITH'DBMSOUTPUTPUTLINE(vsal)EXCEPTIONWHENNODATAFOUNDTHENDBMSOUTPUTPUTLINE('Thereisnotsuchanemplyee!')WHENTOOMANYROWSTHENFORvempIN(SELECT*FROMempWHEREename='SMITH')LOOPDBMSOUTPUTPUTLINE(vempempno||''||vempsal)ENDLOOPEND预定义异常及其处理大型数据库系统*动态SQLEXECIMMEDIATE…USING…INTO…什么时候用?在SQL语句中:来源表不确定目标字段不确定查询条件不确定:select*fromemp“wheresal>”还是“wheresal<”“wheresal>”还是“wheresal>”大型数据库系统*理论课考试时间:闭卷分钟题型分布选择:分X判断:分X名词解释:分X简答:分X写命令(若干小题):分X大型数据库系统*关系数据库的完整性约束:实体完整性:主键参照完整性:外键用户定义完整性:(值)域使用SCOTT用户登录SQL*PLUS的过程connassysdbaalteruserscottaccountunlockconnscotttiger基本的SQL:DDL,DML,order,Like,统计函数,group大型数据库系统*各重要章节的小结、简答题、作业所有模式对象的定义、相关概念、作用、使用和管理普通表:数据类型、创建方法、约束的管理权限管理SQL*Plus的常用命令:,edit,spoolshowuserdescemp编辑和运行SQL语句、PLSQL基本的SQL:DDL,DML,order,Like,统计函数,group各种命令的关键字:grant,revoke,savepoint,rollback、truncate东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系蓝色字符:都是不等东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*PLSnumber:溢出则抛出异常东北大学东软信息学院计算机系东北大学东软信息学院计算机系*List普通数组:长度不限长度有限的普通数组东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系索引值可以任意东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系维持一个循环最少需要几个语句?东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系游标检索必须的语句数目?必须使用循环。东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*Fetch游标名bulkcollectinto集合集合limit行数东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*DECLAREincrementnumber()CURSORcemp(pdeptnoempdeptnotype)ISSELECT*FROMEMPWHEREdeptno=pdeptnoBEGINforIinloopforemprecordincemp(I*)loopincrement:=*Iupdateempsetsal=salincrementwhereEMPNO=emprecordempnoendloopendloopEND东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系内层出现异常:nodatafound东北大学东软信息学院计算机系*东北大学东软信息学院计算机系内层出现异常:toomanyrows东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系存储过程是全局的可以调用别人写的存储过程东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*东北大学东软信息学院计算机系东北大学东软信息学院计算机系*模式对象都不能重名东北大学东软信息学院计算机

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +1积分

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

资料评分:

/263
¥30.0 购买

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料

赵营村 滨文中心站 社教中心 斗底乡 童厝村
广东番禺区新造镇 乌吉热克乡 河南营子乡 西和县 航空署街