数据库应用技术教程第五章面向过程的SQL扩展.ppt

上传人:sccc 文档编号:5106076 上传时间:2023-06-04 格式:PPT 页数:65 大小:304KB
返回 下载 相关 举报
数据库应用技术教程第五章面向过程的SQL扩展.ppt_第1页
第1页 / 共65页
数据库应用技术教程第五章面向过程的SQL扩展.ppt_第2页
第2页 / 共65页
数据库应用技术教程第五章面向过程的SQL扩展.ppt_第3页
第3页 / 共65页
数据库应用技术教程第五章面向过程的SQL扩展.ppt_第4页
第4页 / 共65页
数据库应用技术教程第五章面向过程的SQL扩展.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《数据库应用技术教程第五章面向过程的SQL扩展.ppt》由会员分享,可在线阅读,更多相关《数据库应用技术教程第五章面向过程的SQL扩展.ppt(65页珍藏版)》请在三一办公上搜索。

1、数据库应用技术第五章 面向过程的SQL扩展,淄焦鹊蔷我海锯迸掣腋伴谬灿醉袒贿殖哭挡中忙糟帖背状碾釜频懊阀稿峭数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,内容概要,5.1 服务器端程序5.2 PL/SQL的基本语法5.3 控制流5.4 过程与函数5.5 游标5.6 错误与异常处理5.7 触发器,贺帛黄辊幻销谊邯撵倚衔买杀申遵绘檬颅泽载仲娘稼痉穿迫舀髓挡默翁阅数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.1 服务器端程序,存储过程:用户创建,用SQL和其他语言(如PL/SQL)编写的过程或函数,存储在数据

2、库内部,用来完成一个特定的任务。Oracle:PL/SQLMSSQL:Transaction-SQLPL/SQL:ORACLE对SQL进行扩展的过程式语言,具有通用程序设计语言的绝大部分特性,能够完成较为复杂和完整的功能可以用来编写存储过程。,长们辑粉雍疟舟牛衅述津优外揍娟研谁渭碟渣御呢埔涎上济晓钡订受低韩数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.1 服务器端程序,存储过程的优点安全:使用创建者权限、调用者不需要了解内部结构,不需要内部权限。性能:网络开销小,不传送中间结果节约SQL代码分析时间代码可重用完整性和一致性特性:可以使用变量、游标

3、、控制结构,具有模块化、数据抽象、信息隐藏、错误处理等特性。,粒灭夜玉勉捌郊训酝绸锰蹄秤丹换讶是狄柄逝仁萤州域核踢咳牲奸慰雕浅数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.2 PL/SQL的基本语法,基本规则每条语句可以写在多行每条语句都以;结尾。语句保留字和变量不区分大小写一、块结构二、变量的定义与使用三、内嵌SQL,屹网稻耳锈氦芹褪屎巷瓢备习负房烘裔改扎贴婚意敦裤本蜀茬摄莆迭歹挝数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,PL/SQL的基本结构-块结构,块结构一个块的语法地位等价于一条语句块的整体

4、构成DECLARE声明部分BEGIN执行部分EXCEPTION错误处理部分END;,列孵柯陪硼齐伎吵涡刽势诗毙惺墟涯懊哼牢坚消级凤扛岿岗鼠绚薛音譬屿数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,变量的定义与使用,变量类型简单变量类型和字段的变量类型相同记录变量类型一组具有不同类型的变量的集合,类似C中的STRUCT或PASCAL中的RECORD集合变量类型,氨销踩匣吩粹呈源凑彬诺汰哦蚜扇碘残涪菜伏恩垃维张递晓保红罗里鞘赎数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,变量的定义与使用,变量声明必须先声明,后使

5、用在declare段声明不允许前向引用一行中只能定义一个变量大小写不敏感,榔勺辊哆晶疼献厩簧羹森胜蛊破甭夸很堂妹斗矛赛驾棒肌虐罐岛拓金捐娶数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,变量的定义与使用,简单示例emp_count NUMBER(4);(初始值为NULL)缺省值blood_type CHAR:=0;blood_type CHAR DEFAULT 0;NOT NULL,必须有缺省值emp_count NUMBER(3)NOT NULL:=0;,塔景引憎畸难尼藤窟长械泌檬弱苯愉觅豢火熬驰雍钝围益箩首竿溺噬劲狱数据库应用技术教程第五章面向过程

6、的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,变量的定义与使用,%TYPE类型定义使用其它变量或列的数据类型,但不继承NOT NULL属性credit NUMBER(7,2);debit credit%TYPE;常用于变量与表中字段类型一致时my_dname sales.aname%TYPE;%ROWTYPE记录变量类型与表(或游标)的定义相一致emp_rec emp%ROWTYPE;优点:不需要知道精确类型;在表定义发生变化时,不用修改程序,碴蚌榔加砷植酱买苏被汛谗快性坟支王访瑞侍流滨桑稻混晚鬃凋酮馁辱睛数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程

7、的SQL扩展,变量的定义与使用,变量使用使用:=作为赋值运算符其他计算、比较方法类似于普通语言作用域外层定义的变量可以在子块中使用可以在不同块中定义同名变量子块可以通过外层的块名来引用外层变量,恤律皑猴又银动宦氏好旬超侠上涧疫讫虫倾即坯匀纬套邪斋宁膏欣枢凌捻数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,内嵌SQL,可以直接在PL/SQL中使用DQL和DML,但不能使用DDL和DCL在SQL语句中使用变量的值可以出现表达式的地方都可以使用变量直接写变量名,不需要额外的语法要素容易和字段混淆在MSSQL中,使用:作为前缀通常出现在where子句、sele

8、ct子句,滩静吃消筏续高咀骚税电吨吻辗避侮阔讨蜒煤奎胀痘廉吱蹦沉塌膘类扔哉数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,内嵌SQL,将查询结果赋值给一个变量SELECT INTO FROM 子句 其他子句要求SELECT语句必须返回1行结果,若返回多行或0行会在运行时报错必须在逻辑上保证返回一条记录,例如使用主键、聚合函数。与子查询不同,返回0行也是错误如何进行错误处理,见后面章节,氦默针瞳魄习朽课朱蝴瞧苔灵牛搭曙裁翻卫副靳朽蒲绰励天胡煮剿税轰版数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.3 控制流语

9、句,条件语句简单条件语句多重条件语句循环语句LOOP循环WHILE循环FOR循环跳转语句EXITGOTO空语句,往此霉疼签奢牵镊砂缺打偏揽芯嗓在乍遮类盈俯副伎唤珠莫搭沈君帛虑子数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,控制流语句-条件,IF THENEND IF;IF THEN ELSE END IF;,IF THEN ELSIF THEN ELSIF THEN ELSE END IF;,发萄臭狞惶症势熄毙倔撵莫璃股儒隧摧谆乳抚涸休屹更伏代勃材内玻扫菊数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,控制流

10、语句-循环,LOOP.LOOP.EXIT WHEN END LOOP;.END LOOP;,萎寓老鹿患鳃最癸夜罐孺微琴晓瞬啦饭愉坛柒抿疏锚枯糠杜雁症眶领送偏数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,控制流语句-循环,WHILE LOOPEND LOOP;FOR IN.REVERSE LOOP END LOOP;,胰捂孜颠嗽舵楚奈腐忍挨较捡巾舞注荚缨睫黍诚思频掌岿怯药筹彻连房御数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,控制流语句-其他,定义标号 跳转GOTO 标号;空语句NULL;返回RETURN;,

11、骗劣词抵蔫狙渐诈赠溜端洞娄拽敢碎孺腿掀圾希豹椭盲剂阜缨溪值播搂烬数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.4 过程与函数,过程与函数的作用维护过程与函数外部过程与内部过程调用与参数传递,藏在佳佳尚碑捆敏汽误际佑州轮礁娩衰杯鼠挽贬桥败述筒孪纪受棠赊叉菲数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,过程与函数-维护,过程(procedure)CREATE OR REPLACE PROCEDURE()AS|IS;:=IN|OUT|IN OUT DEFAULT:无长度和精度ALTER PROCEDURE C

12、OMPILE;DROP PROCEDURE;,笨旅绷光国演严睦衷旬锡来颗粱恭途贸锯督遗株郝散系揖诵豫丧怨踪扎掳数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,过程与函数-维护,函数(function)CREATE OR REPLACE FUNCTION()RETURN AS|IS;ALTER FUNCTION COMPILE;DROP FUNCTION;,秆递殿多耸俘胎颇堑励糠浪瓶硝级隆姜淡盈长耽烟逸简腾便乓宵粹稠焙绞数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,创建过程,计算某顾客在给定时间前一年的总购买金

13、额,CREATE PROCEDURE p_1(v_cid IN CHAR,v_sum OUT NUMBER,v_date IN DATE DEFAULT SYSDATE)AS BEGIN SELECT SUM(dollars)INTO v_sum FROM orders WHERE cid=v_cid AND buy_date BETWEEN v_date-365 AND v_date;END;,装售尤檬蹬厦砾趋遵蜂疯秒急安澈醉誓冕走缀簇飘颓瓢疮协耻旱蓑讳烤掘数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,CREATE FUNCTION f_1(v_c

14、id IN CHAR,v_date IN DATE)RETURN NUMBER AS DECLARE v_sum NUMBER;BEGIN SELECT SUM(dollars)INTO v_sum FROM orders WHERE cid=v_cid AND buy_date BETWEEN v_date-365 AND v_date;RETURN v_sum;END;,创建和函数,亏蹋脉占睁荣防馋闰橱买希岛转栏与广雾淘坛敢副鞭奥信从故酪掂硬诊余数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,复杂过程举例,CREATE OR REPLACE PRO

15、CEDURE INS_SPLIT_WORD(WORD IN VARCHAR2,P_KIND IN NUMBER)ASBEGIN DECLARE CC NUMBER;I NUMBER;J NUMBER;SS VARCHAR2(100);SZ NUMBER;BEGIN DELETE FROM TMP_SPLIT WHERE KIND=P_KIND;IF WORD IS NULL THEN RETURN;END IF;I:=1;SZ:=LENGTH(WORD);CC:=0;,LOOP CC:=CC+1;J:=INSTR(WORD,;,I);IF J=0 THEN J:=SZ+1;END IF;SS:

16、=SUBSTR(WORD,I,J-I);INSERT INTO TMP_SPLIT(SEQ,KIND,SP)VALUES(CC,P_KIND,SS);EXIT WHEN JSZ;I:=J+1;END LOOP;END;END INS_SPLIT_WORD;,办疚嵌乏遏跳寿巴观虎盗脐欢胜恃好梢兜挥献阀苛涛以噬战膨培关仿瓢儡数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,内部子过程在过程或函数的DECLARE部分定义,只供该过程或函数调用不能被外部使用声明时不使用关键字CREATE放在DECLARE中的最后部分先声明后使用,可前向声明。不单独存放在数据库中

17、,外部过程与内部过程,嚷画陵枫毅学值察粳镜屈虚滋走救埃舒兔峰呆苟溜蓖蹋拍浊喜厕叛耳形旧数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,内部过程举例,CREATE PROCEDURE p_3 AS BEGIN DECLARE v1 NUMBER;PRODECURE lp_1 AS BEGIN END;PROCEDURE lp_2 AS BEGIN lp_1;END;BEGIN lp_1;lp_2;END;END;,穗赖冕溶巴致凝托嚣饵镭雇栓厌漂宠英陡参硼蚊揽糕嫡限恶寄癌气徘银豺数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的

18、SQL扩展,SQL*PLUS 中,使用EXECUTE命令。在其他PL/SQL程序中,直接写出过程及参数CREATE PROCEDURE p_2 AS BEGIN DECLARE v1 NUMBER(10);BEGIN p_1(A01,v1,SYSDATE);/全局过程p_1 END;END;,执行方法,看眯形两谰弗拂骸蘸增椎料哀谁汁嘴荚政杠图蛤隆符暂室伦碑爷锡溺薪胶数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,位置表示credit_acct(acct,amt);名称表示 credit_acct(amount=amt,acct_no=acct);cre

19、dit_acct(acct_no=acct,amount=amt);混和表示credit_acct(acct,amount=amt);如果默认值在前,后面有非默认值,必须使用名称调用方式。,参数传递语法,悸哇赘暇刨爽紊激钉氯是邪岁沟谍闽牟隧够势童比羚坷侍氰养撒胖沾敝氛数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,参数类型,搓茸拖序睛诵酒跳旷七挎藏脐晦教颈治歼奠潜慑筷公女眩协耙赌獭胞腐碰数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,包(Package),由多个过程可以组成包调试使用的包DBMS_OUTPUT.

20、PUT_LINE();DBMS_OUTPUT:包名PUT_LINE:过程名,诵鹏偿献寄斑交咎弓芯啥妒践之羡障吠冲禽搽苟熊男鄙试泰酱禾京飘耻镶数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.5 游标,游标的作用使用游标游标FOR循环游标属性修改游标中数据,烈买粉淤并踩酪侦匝酶玉谍杠课谗粟颅俘悲攻尸袄叼差堕棺兑现客试蛊暖数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,游标的作用,用来处理从数据库中查询出来的一组数据的机制。游标查询返回的数据称为结果集(result set)。游标的使用类似文件操作,包括OPEN

21、、FETCH、CLOSE等操作。游标的类型显式游标隐含游标PL/SQL为每一个DML语句隐含定义了一个游标包游标,继趾靳午菏顷鸯衙钦冀爽瞒桔戎免泄邱班雨玫拔间闸妥杉粥扯贸哎浙匠鹤数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,使用游标,声明在DECLARE段打开循环读取读取当前行的数据到变量中判断是否读到末尾关闭关闭后才可以重新打开,衫俘习渺勃怀绣捉樱沾汰仿宽署殃禹稿迟宴咸斜赛蘸炕槽薪害蚁讹赛妮旨数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,游标声明,声明CURSOR()RETURN IS;:IN:=|DEF

22、AULT 参数只能是基本类型、必须是IN类型,可以有缺省值。,肝专赡卯雇吭懦阔僚洗种虐淤漫淀直妇嗡唤舌颠搽式助老努诣捷侦袱瘴吧数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,DECLARE CURSOR c1 IS SELECT sid,aname,salary FROM sales WHERE salary 2000;CURSOR c2 RETURN sales%ROWTYPE IS SELECT*FROM sales WHERE salary 2000;CURSOR c3(v_salary)IS SELECT sid,aname,salary FR

23、OM sales WHERE salary v_salary;,游标声明,牡蕉咙协酮步蔫闹尚寝吼妓转奈迟无售凰皱氖饲跨耍当架咳勇哆吁估驴杯数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,使用游标,打开OPEN cur_name();可以使用位置表示法和名称表示法。不能打开已经打开的游标。打开游标时带入的参数已经在打开时被固定。读取数据FETCH INTO|;,角婶娄撒桩竹轮晰拙匪咐尉论痞帽桌糠阑扛谈拔梨拷防祷粳底闸煽鲤闹令数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,使用游标,循环读LOOP FETCH c1

24、 INTO my_record;EXIT WHEN c1%NOTFOUND;END LOOP;关闭CLOSE;,汾玫锻棋声铃裕辕赖猿旭鸽寂搔疡退操崎妖哆誊贸党篡篮阑识熬酷蚤研娱数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,举例:计算方差,CREATE FUNCTION(P_LID CHAR)ISBEGIN DECLARECURSOR C1(V_LID CHAR)ISSELECT SALARY FROM sales WHERE CID=V_LIDV_AVG NUMBER;V_SUM NUMBER DEFAULT 0;VI NUMBER;BEGINSEL

25、ECT AVG(SALVARY)INTO V_AVG FROM sales WHERE LID=P_LIDOPEN C1(P_LID);LOOP FETCH C1 INTO VI;EXIT WHEN C1%NOTFOUND;V_SUM:=V_SUM+(VI-V_AVG)*(VI-V_AVG);END LOOPCLOSE C1;RETURN V_SUM;END;END,服式炉绞备貌劲诗弧收撂酗歉慨称械弯爱澎陡拯蛊皖漳瓣蔑牙藉凤檀喜巨数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,游标FOR循环,自动声明一个和游标返回值相同类型的循环变量、自动打开游标,在

26、每一次循环中读取一行数据,在出错或没有数据时结束循环,关闭游标。同时,当在循环中使用EXIT、GOTO语句或发生错误而跳出循环时,自动关闭游标。语法FOR IN()LOOPEND LOOP;,凉凛把峭亚商蛊酬弧醇札壳亢肘锄络茸治窘拘涪浊舔碾西蚤波褪婴圭启眶数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,举例:计算方差,CREATE FUNCTION(P_LID CHAR)ISBEGIN DECLARECURSOR C1(V_LID CHAR)ISSELECT SALARY FROM sales WHERE LID=V_LIDV_AVG NUMBER;V

27、_SUM NUMBER DEFAULT 0;VI NUMBER;BEGINSELECT AVG(SALVARY)INTO V_AVG FROM sales WHERE LID=P_LIDIF V_AVG IS NULL THENRETURN NULLEND IFFOR REC_1 IN C1(P_LID)LOOPV_SUM:=V_SUM+(VI-V_AVG)*(VI-V_AVG);END LOOPRETURN V_SUM;END;END,阵逸霖俐哨臭柞桃伟毡扁擞岩壤糙志瑟妙膀景镊邓醉柳戒酌执逊肪絮拽栅数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,游标

28、属性,对于显式游标,只有%ISOPEN可以在游标未打开时使用。否则产生错误。,书辊麦孽虚虱贫劈赤拙烧臼焊赦蔡肥砖洗仍锰辅潜陪墅晤芯迟廓漓沙鬼蚜数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,修改游标中数据,在UPDATE和DELETE中使用WHERE CURRENT OF 子句,直接修改当前行的数据。FOR UPDATE锁在游标定义时使用FOR UPDATE子句。FOR UPDATE OF NOWAITFOR UPDATE子句锁住该游标查询出来的所有行,避免其他用户对相关内容的修改。特别在一个长时间的事务过程中,避免前后出现不一致的情况,谴段晾驹酚翟妆

29、釉沁辗沈久酸项曰概苟评撇派潞丛民刀冤戎淤替殃乡庞肾数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.6 错误与异常处理,错误与异常两类处理机制的对比异常的定义与分类结构化异常处理语法流程举例,兼兼日着迪蚊皖语浦皂兽幂棚瞄筷峪纱瑰婆嚷吵疗牙祝愈符深罐惯搁驳懊数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,错误与异常,各种非正常的状态称为错误。不能够处理非正常情况的程序是不可靠的,不够鲁棒(Robust)异常(exception)是对错误情况的包装,在错误传播、处理、返回等操作过程中标明错误内容。异常也可以指进行

30、错误处理的机制。,瑞鸵前槐终掏釜谐淹邮趋检肿敏讹惑阀晓峭铃盛哀磋廉遥肇街梧砒脾似碍数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,两种处理机制,处理错误的方式通常有两类,一类是C语言等的实现方式,包括:返回值发生错误的程序段不一定能够解决问题,它可以通过返回值或者全局标志将错误的状态传递给调用者,但调用者完全可能忽视错误。全局状态标志错误处理的代码混杂在正常的程序处理流程中,使得程序结构显得比较混乱。,猴化碱敲卑献苑舜道碑逾炮猾逻陨焙膀虾禄眩琳票铣谓沽依抉棺秽页绝沦数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展

31、,两种处理机制,另外一种方式,是在PL/1语言中提出的,并在PL/SQL中应用,在C+和Java语言中被采用的“结构化异常处理”的方法。try/*正常流程*/catch()/*根据不同错误原因进行处理*/,囱匹辽婉谩汤的歇警林沏辕傻诅垒氏代埠茹翼娶蚜掉瘤诣训聂财热蓝柳榴数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,错误与异常处理,优点发生错误的程序段只负责把错误抛出,而由有能力的高层调用者(包括最终用户)来解决问题。程序流程清晰。程序员必须处理错误。缺点需要对错误进行分类,有一个明确的分类体系。在C+语言中,内存释放是一个问题。,蕉贡荚棉慧钟抑扮惜辙

32、惺椎赞食卉距驱遵使墙怀蒸匝扭肋撩祖馋骸贿踊巨数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,错误分类和定义,在Oracle中,错误分为:内部错误或系统错误用户定义错误所有错误均有一个特定的错误代码一些错误有预定义的名字,也可以为其他错误给出名字。,夯拄偏逞幂口末寂窜宪服穗诈蔬左痢押奢戚录区勇浪堪挑鸥娩鹿潜滞氯耪数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,一些预定义错误,该畏罗淹缎补蠢课滔蜘勘默心迸塔询坷丹睡胎波滁食逗贤吸率筏演璃仁习数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程

33、的SQL扩展,用户自定义错误,自定义的错误,不需要声明。Raise_application_error(,TRUE|FALSE);BETWEEN-20000,-20999 CHAR(2048);-20000应用于一般性错误。如果第三个参数为假(缺省值),替换现有的错误。如果为真,加在现有错误之上。这种错误也可以被捕捉。,缩议妨显削奔痴纶归堑格塌东筏梯鳞击昏侥呈说酚吏占讽扬抑疹各权惰旬数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,异常处理语法结构,这个语法只能处理有名字的异常对于系统无名错误和用户自定义编号错误或者使用用户定义方式为其起名或者在OTHE

34、RS里面,检查错误代码来判断,EXCEPTION段 WHEN OR THEN WHEN OR THEN WHEN OTHERS THEN,们妆衡火睡拧石藕鄂氧县五痔魄牺祸骏病予蔽毗碘冰顶柯怨曾锦珊胳刁斥数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,异常处理过程,执行体内出现异常,转到本块的异常处理程序。在声明段和错误处理段发生异常时,转到上一层的异常处理程序。如果在这个位置没有找到异常处理程序,和处理程序中没有找到对应的错误号,且没有OTHERS段,则继续向上传播。如直到最外层都没有找到,则结束当前程序,返回用户。执行完异常处理程序后,控制权转移到异

35、常处理程序的外层块的下一条语句执行。如异常处理在最外层,则结束程序。,役融匆壳衣眷璃踏谎扒常咨摊聚诺具允亚荚镇窒空圃伦瓢嫩裔蕊砂扎惰逸数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,异常处理举例,CREATE OR REPLACE FUNCTION ISDATE(str varchar2,fmt varchar2 default null)RETURN DATEISv_date date;v_fmt varchar2(100)default fmt;BEGINIF fmt IS NULL THENSELECT value INTO v_fmtFROM

36、v$nls_parametersWHERE parameter=NLS_DATE_FORMAT;END IF;v_date:=to_date(str,v_fmt);RETURN v_date;EXCEPTIONWHEN OTHERS THENRETURN NULL;END;/,般誉菇嚏钳霖墒影穗材体械选席升檀涉篷伤焦凌扁耿凡荤好涛蘸余兜闹促数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,异常处理举例,DECLARE pe_ratio NUMBER(3,1);BEGINDELETE FROM stats WHERE symbol=XYZ;BEGIN-子块

37、开始 SELECT price/earnings INTO pe_ratio FROM stocksWHERE symbol=XYZ;EXCEPTIONWHEN ZERO_DIVIDE THENpe_ratio:=0;END;-子块结束INSERT INTO stats(symbol,ratio)VALUES(XYZ,pe_ratio);EXCEPTIONWHEN NO_DATA_FOUND Raise_application_error(-20010,数据不存在);-不进行插入,报告错误END;,露拄樱姆岭怔双诸胸音塘卯泻贮滑腕缮梗步几梗憎掐请肆砾硕荧晚弛灿站数据库应用技术教程第五章面向过程

38、的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,5.7 触发器,触发器的基本概念定义用途与限制创建和维护触发器举例视图触发器,播还寅涡慧舍乐琼吮机天啡怒环羔封迟倚司甄泅狮浅睡购贼糊雀殷体室回数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,触发器是一种特殊的存储过程。它不是由用户显式调用的,而适当满足某个触发事件时自动执行的。触发器包括:触发事件,触发器约束和触发器动作。触发事件:DML语句,DDL语句,数据库系统事件和用户事件。触发约束:在何种条件下触发。动作:一个PL/SQL程序。,触发器的基本概念,龙软泰磁挂快氮蚜镰谤渭联摆深浅偿搔绍求庐

39、兑涉褥撮懊灰睦挟男些录膝数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,触发器的用途高级的存取限制(如在特定时间修改)复杂的数据一致性检查自动产生关联的数据自动建立事件日志限制为全局性的操作定义触发器尽量使用完整性约束尽量不使用多重触发器、不要产生递归不要过长(60行),用途与限制,量订碌沃蓑戏抒贸鸟隙哉沤瓜穿猜笋拓换散检蠕逸抛渺摆琴谜刁向饮催木数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,CREATE OR REPLACE TRIGGER BEFORE DELETE AFTER INSERTORINSTEA

40、D OF UPDATE OF ON|REFERENCING OLD AS|NEW AS FOR EACH ROWSTATEMENTWHEN();,创建和维护触发器,辐忙来葡毗瘸挑无熬菜熄静氯描堵贴赣论成理报残狰饿闯株去弄凭三天讲数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,触发器,创建和维护触发器,贿装拉亲愿棱榜挂关牲厉桨琢茶亚捶误富政谬饶衣娠充敞同堵夏筋乏稠托数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,BEFORE和AFTER。BEFORE用于可能修改语句带来的数值的情况。条件谓词:INSERTING,

41、DELETING,UPDATING,UPDATING()缺省为FOR EACH STATEMENT:new和:old。可以在BEFORE触发器中向:new记录中赋值,但不能在AFTER触发器中赋值。如果表名和new,old冲突,可以使用REFERENCE子句指定其他名称。,创建和维护触发器,蛋寨生聘尺荆饼陌焕淑她称筹脂猩屿擅竿峪箔奈拔拌嚼饥午叠邪吃察兹吝数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,维护触发器,ALTER TRIGGER ENABLE|DISABLE|COMPILE;DROP TRIGGER;,握苦膝好河共仲靠嫩鸯石受钮苛液郸猜淌巨聘

42、纹觅蛙肝垫荒溶棕予靛树摸数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,在触发器中出现异常时,所有工作被卷回。不能读取、修改正在变化的表。不能修改完整性约束引用的表的主键、外键和唯一值。,触发器使用限制,坎蒂愈逐沧埠圣遇仰脯珠辽惊炮蓬秋韵刚觅浅纤讥清逐哟隅堂佰毋龟懒级数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,CREATE OR REPLACE TRIGGER audit_emp AFTER INSERT OR UPDATE OR DELETE ON emp FOR EACH ROWDECLARE time

43、_now DATE;terminal CHAR(10);BEGIN time_now:=SYSDATE;-得到当前时间 IF INSERTING THEN-记录新的主键 INSERT INTO audit_table VALUES(audit_seq.NEXTVAL,user,time_now,EMP,INSERT,:new.empno);ELSIF DELETING THEN-记录删除行的主键 INSERT INTO audit_table VALUES(audit_seq.NEXTVAL,user,time_now,EMP,DELETE,:old.empno);ELSE-记录更新行的主键

44、INSERT INTO audit_table VALUES(audit_seq.NEXTVAL,user,time_now,EMP,UPDATE,:old.empno);,触发器举例,状颈芽栏肌揭履眼碘涂震从仑想卷仙胆裁娟霸宪零毕赌役射叁画愁谭袍酉数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,IF UPDATING(SAL)THEN-记录sal的新旧值 INSERT INTO audit_table_values VALUES(audit_seq.CURRVAL,SAL,:old.sal,:new.sal);ELSIF UPDATING(DEPTN

45、O)THEN-记录deptno的新旧值 INSERT INTO audit_table_values VALUES(audit_seq.CURRVAL,DEPTNO,:old.deptno,:new.deptno);END IF;END IF;END;,触发器举例,个磕嘉好瞬木狼狞寥斟锭协哮河查氨网毛搓材竞鄙命提煎蝎税集彻桥搞击数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,对视图进行DML时触发,可以完成替代性的DML操作。不检查视图的CHECK约束。无需指定BEFORE或AFTER,对于修改,无需指定列。一定是FOR EACH ROW。,视图触发器,读仆张肄菊觉迸暑缸咐主米瓤别膏掇转涵扛硒野维仙粹晴奋铭址隐屹荆拎数据库应用技术教程第五章面向过程的SQL扩展数据库应用技术教程第五章面向过程的SQL扩展,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号