版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《数据库原理与应用》任务4.1了解DMSQL编程基础项目4:数据库编程第12讲SQL编程从这里开始在电力调度管理系统中,每月需要计算用户当月的用电量和电费。为引导节约用电,优化电力资源配置,电费采用阶梯电价计费方式。本任务使用DMSQL编程基础,包括%TYPE类型、%ROWTYPE类型、变量定义、流程控制及游标等完成用户当月的用电量和电费计算。素质目标能力目标知识目标1)了解DMSQL语言的扩展数据类型%TYPE、%ROWTYPE。2)掌握DMSQL语言的变量定义及赋值。3)掌握DMSQL语言的流程控制语句。4)理解游标的作用,掌握游标的创建和使用。1)能够灵活使用DMSQL语言进行程序编写。2)能够灵活使用DMSQL语言的流程控制语句进行程序编写。3)能够使用游标查询记录并进行逐条处理。1)培养编码的规范性,形成良好的编程风格。DMSQL程序数据类型
为进一步提高DMSQL程序的程序设计属性,DMSQL程序还扩展支持%TYPE、%ROWTYPE以及用户自定义的记录类型、对象类型、数组类型、集合类型等。4.1.1DMSQL编程基础DMSQL程序数据类型(1) %TYPE类型%TYPE可以将变量同表中列的类型进行绑定。其使用格式如下:【例4-1】%TYPE类型示例。该例子声明了v_area_name变量,并使v_area_name变量拥有区域表T_AREA中AREA_NAME列的类型。DECLARE v_area_nameT_AREA.AREA_NAME%TYPE;<变量名><表名>.<列名>%TYPE;DMSQL程序数据类型(2) %ROWTYPE类型%ROWTYPE将返回一个基于表定义的运算类型,它将一个变量声明为具有相同类型的数据库行。其使用格式如下:【例4-2】%ROWTYPE类型示例。该例子声明了一个v_rec变量,该变量中的字段与区域表T_AREA中的行相对应。在DMSQL程序设计中使用%TYPE和%ROWTYPE是一种非常好的编程风格,它使得DMSQL程序更加灵活,更适应于对数据库的处理。DECLARE v_recT_AREA%ROWTYPE;<变量名><表名>%ROWTYPE;2.语句块语句块格式如下:[DECLARE<变量声明>{,<变量声明>};]BEGIN<执行部分>[<异常处理部分>]END;说明:DECLARE:定义声明部分。该部分可省略。BEGIN和END:定义执行部分。所有的可执行语句都放在这一部分,其他的语句块也可以放在这一部分。异常处理部分:是处理异常或错误,由EXCEPTION关键字定义。该部分可省略。语句块可以嵌套。2.语句块【例4-3】简单语句块示例。--DECLARE声明部分声明了一个变量a,执行部分输出了a的值。DECLARE aINT:=5;BEGIN PRINTa;END;3.变量声明及赋值变量声明格式如下:<变量名>{,<变量名>}<变量类型>[:=|DEFAULT|ASSIGN<初值>];说明:变量名必须以字母或下划线、$、#符号开头,可以包含数字、字母、下划线以及$、#符号,且不能与DMSQL程序保留字相同。使用赋值符号:=或关键字DEFAULT、ASSIG可以在定义时为变量指定初始值。3.变量声明及赋值变量声明后,给变量赋值的方式有:(1)直接赋值(2)通过SQL语句赋值<变量名>:=<表达式>;或SET<变量名>=<表达式>;SELECT<表达式>INTO<变量名>FROM<表名>;3.变量声明及赋值【例4-4】变量赋值示例。--声明多个变量并赋值的示例DECLAREv_nameVARCHAR(50):='张明’;--字符串变量v_cosumptionINTDEFAULT1050;--使用DEFAULT赋初值v_balanceT_USERINFO.BALANCE%TYPE;--未赋初值的变量,与表中的列类型绑定BEGIN--通过SELECT语句给变量v_balance赋值SELECTbalanceINTOv_balanceFROMT_USERINFOWHEREUSER_ID='1000000001';--打印所有变量值PRINT'姓名:'||v_name;--||为连接操作符,可连接两个字符串PRINT'用电度数:'||v_cosumption;PRINT'余额:'||v_balance;END;DMSQL中的流程控制结构包括分支结构、循环控制结构、顺序结构等。1. 分支结构DMSQL中分支结构主要有IF语句、CASE语句和SWITCH语句。4.1.2流程控制(1) IF语句1)简单IF语句语句格式如下:其执行流程为:当条件表达式的值为TRUE时,执行语句;否则不执行语句。2)两路分支IF语句语句格式如下:其执行流程为:当条件表达式的值为TRUE时,执行语句1;否则,执行语句2。3)多路分支IF语句语句格式如下:其执行流程为:依次判断条件表达式的值,执行第一个为TRUE的条件对应的语句。如果所有条件都不满足,则执行ELSE后的语句。IF<条件表达式>THEN<语句>;ENDIF;IF<条件表达式>THEN<语句1>;ELSE<语句2>;ENDIF;IF<条件表达式1>THEN<语句1>;ELSEIF<条件表达式2>THEN<语句2>;...ELSE<语句N>;ENDIF;【例4-5】简单IF语句示例。在电力调度管理数据库中,查询区域表T_AREA中是否存在区域名称为“梁溪区”的区域,若存在,则输出“已存在梁溪区!”。DECLAREv_countINT;BEGIN--查询T_AREA表中是否存在"梁溪区"SELECTCOUNT(*)INTOv_countFROMT_AREAWHEREAREA_NAME='梁溪区';IFv_count>0THENPRINT'已存在梁溪区!';ENDIF;END;【例4-6】两路分支IF语句示例。在【例4-5】的基础上修改,若存在“梁溪区”的区域,则输出“已存在梁溪区!”;若不存在,则在T_AREA表中插入一条“梁溪区”的信息。DECLAREv_countINT;BEGIN--查询T_AREA表中是否存在"梁溪区"SELECTCOUNT(*)INTOv_countFROMT_AREAWHEREAREA_NAME='梁溪区';IFv_count>0THENPRINT'已存在梁溪区!';ELSE INSERTINTOT_AREAVALUES('101','梁溪区');ENDIF;END;【例4-7】多路分支IF语句示例。根据电费档位类型的值,判断属于哪一个计费档,并输出相应内容。运行后,输出“计费档位为:第二档”。DECLAREv_type_idINT:=2;--电费档位类型变量,赋初值为2v_levelVARCHAR(50);--计费档位BEGINIFv_type_id=1THENv_level:='第一档';ELSIFv_type_id=2THENv_level:='第二档';ELSEv_level:='第三档';ENDIF;PRINT'计费档位为:'||v_level;END;(2) CASE语句1)简单CASE语句语句格式如下:其执行流程为:将条件表达式的值与WHEN子句中的值进行比较,执行第一个匹配到相等的THEN后的语句。若没有匹配到,如有ELSE子句,则执行ELSE子句;若没有ELSE子句,则不执行任何操作。2)搜索CASE语句搜索CASE语句语句格式如下:其执行流程为:依次计算每个WHEN子句的条件表达式,当某一个为TRUE时,则执行相应THEN后的语句。若没有为TRUE的条件表达式,如有ELSE子句,则执行ELSE子句;若没有ELSE子句,则不执行任何操作。CASE<条件表达式>WHEN<值1>THEN<语句1>[WHEN<值2>THEN<语句2>]...[ELSE<语句N>]END[CASE];CASEWHEN<条件表达式1>THEN<语句1>[WHEN<条件表达式2>THEN<语句2>]...[ELSE<语句N>;]END[CASE];【例4-8】简单CASE语句示例。将【例4-7】的判断电费计费档改为用简单CASE语句实现。DECLAREv_type_idINT:=2;--电费档位类型变量,赋初值为2v_levelVARCHAR(50);--计费档位BEGINv_level:=
CASEv_type_id--直接对v_type_id进行匹配WHEN1THEN'第一档'--此处不能加分号“;”,否则会出错WHEN2THEN'第二档'ELSE'第三档’ENDCASE;PRINT'计费档位为:'||v_level;END;【例4-9】搜索CASE语句示例。将【例4-7】的判断电费计费档改为用搜索CASE语句实现。DECLAREv_type_idINT:=2;--电费档位类型变量,赋初值为2v_levelVARCHAR(50);--计费档位BEGINv_level:=CASEWHENv_type_id=1THEN'第一档'WHENv_type_id=2THEN'第二档'ELSE'第三档'END;PRINT'计费档位为:'||v_level;END;(3)SWITCH语句其语句格式如下:SWITCH(<条件表达式>){CASE<常量表达式1>:<执行部分1>;BREAK;…CASE<常量表达式n>:<执行部分n>;BREAK;[DEFAULT:<执行部分>;]}其执行流程为:将条件表达式的值与CASE后的常量表达式逐个进行比较,若与某一个常量表达式的值相等,就执行此CASE后的语句;若都不相等,则执行DEFAULT后的语句,若没有DEFAULT,则不做任何操作就结束。【例4-10】SWITCH语句示例。将【例4-7】的判断电费计费档改为用SWITCH语句实现。DECLARE{INTv_type_id=2;//注意变量定义格式不同
SWITCH(v_type_id){CASE1:PRINT'计费档位为:第一档';BREAK;CASE2:PRINT'计费档位为:第二档';BREAK;DEFAULT:PRINT'计费档位为:第三档';}}2.循环结构DMSQL中循环结构主要包括LOOP、WHILE和FOR语句三种基本形式。(1)LOOP语句其语句格式如下:执行流程为:重复执行语句,直到遇到EXIT、GOTO或RAISE语句结束循环。(2)WHILE语句其语句格式如下:执行流程为:先计算条件表达式,若值为TRUE,执行语句,然后控制重新回到循环顶部。若条件表达式的值为FALSE,则结束循环。LOOP<语句>;ENDLOOP[标号名];WHILE<条件表达式>LOOP<语句>;ENDLOOP[标号名];【例4-11】用LOOP语句求1到100的累加和并输出。DECLAREiINT:=1;sumINT:=0;BEGINLOOPsum:=sum+i;i:=i+1;EXITWHENi>100;--当i>100时结束循环ENDLOOP;PRINT'1到100累加和(LOOP):'||sum;END;运行结果:--当i<=100时执行循环WHILEi<=100LOOPsum:=sum+i;i:=i+1;ENDLOOP;改为WHILE语句如何写?(3)FOR语句其语句格式如下:说明:循环计数器是一个标识符,类似于循环变量,是只读的,不能在循环体内手动修改其值。下限表达式和上限表达式用于定义循环的执行范围。默认情况下,循环计数器
会自动从下限值开始,每次递增1,直到超过上限值。REVERSE关键字用于控制循环计数器的变化方向,使循环从上限向下限递减执行。FOR<循环计数器>IN[REVERSE]<下限表达式>..<上限表达式>LOOP<语句>;ENDLOOP[标号名];(3)FOR语句
FOR语句的执行流程为:
首先,初始化循环计数器为下限值(使用REVERSE时初始化为上限值);
然后检查循环变量是否在下限和上限范围内,若在范围内则执行循环体,之后循环变量自动递增1(或使用REVERSE时递减1),再次进行范围检查并重复上述过程,直到循环变量超出范围时退出循环。
整个过程无需手动控制变量变化,循环结束后变量立即失效。【例4-13】用FOR语句求1到100的累加和并输出。DECLAREsumINT:=0;BEGINFORiIN1..100LOOP--i无需提前声明sum:=sum+i;ENDLOOP;PRINT'1到100累加和(FOR):'||sum;END;DMSQL程序引入了游标,允许程序对多行数据(结果集)进行逐条处理。DMSQL中的游标分为静态游标和动态游标两类。静态游标静态游标是在编译时就能确定静态游标使用的查询。静态游标分为隐式游标和显式游标两种。(1)隐式游标
隐式游标由系统自动创建和管理,每当执行DML语句或SELECT...INTO语句时,系统会自动声明一个隐式游标。4.1.3游标(2)显式游标
显式游标需要用户明确定义,指向一个查询结果集,用于处理返回多条记录的查询。使用显式游标有四个步骤:定义游标:声明游标打开游标:执行Select语句移动数据:处理每一行关闭游标:清除资源(2)显式游标1)定义游标说明:FAST指定游标是否为快速游标。默认为NOFAST,即为普通游标。快速游标提前返回结果集,速度提升明显,但存在使用上的约束。游标将指向查询语句的查询结果集。CURSOR<游标名>[FAST|NOFAST]IS|FOR<查询语句>;或<游标名>CURSOR[FAST|NOFAST]IS|FOR<查询语句>;(2)显式游标2)打开游标
打开游标时,系统执行这个游标定义时所关联的查询语句,获得结果集,并将游标定位到结果集的第一行之前。OPEN<游标名>;(2)显式游标3)移动游标移动游标是将游标移动到结果集的某个位置,获取数据。其中,fetch选项可以取:NEXT:游标下移一行PRIOR:游标前移一行FIRST:游标移动到第一行LAST:游标移动到最后一行ABSOLUTEn:游标移动到第n行RELATIVEn:游标移动到当前指示行后的第n行FETCH[<fetch选项>]<游标名>INTO<变量列表>;(2)显式游标4)关闭游标游标在使用完后应及时关闭,以释放它所占用的内存空间。CLOSE<游标名>;(2)显式游标
显式游标有%FOUND、%NOTFOUND、%ISOPEN和%ROWCOUNT4个属性。属性含义取值%FOUND最近一次取到数据TRUE/FALSE(首次前NULL)%NOTFOUND与%FOUND相反取到为FALSE,否则TRUE(首次前NULL)%ROWCOUNT已取行数数值(首次前为0)%ISOPEN游标是否打开TRUE/FALSE%FOUND、%NOTFOUND、%ROWCOUNT在游标未打开时会抛异常;%ISOPEN不会。【例4-14】使用显式游标输出街道供电量申请表T_SUPPLYSTATUS中的前5行数据的申请供电日期、申请街道编码和申请供电量。DECLARECURSORcur_supplyFORSELECTSUPPLY_DATE,COMMUNITY_ID,SUPPLY_NUMFROMEPDMS.T_SUPPLYSTATUS;--定义游标cur_supplyv_supply_dateT_SUPPLYSTATUS.SUPPLY_DATE%TYPE;v_community_idT_SUPPLYSTATUS.COMMUNITY_ID%TYPE;v_supply_numT_SUPPLYSTATUS.SUPPLY_NUM%TYPE;【例4-14】续BEGINOPENcur_supply;--打开游标LOOPFETCHcur_supplyINTOv_supply_date,v_community_id,v_supply_num;--移动游标EXITWHENcur_supply%NOTFOUND;--当游标取不到数据时,结束循环PRINTv_supply_date||''||v_community_id||''||v_supply_num;EXITWHENcur_supply%ROWCOUNT=5;--当已经输出了5行数据时,结束循环ENDLOOP;CLOSEcur_supply;--关闭游标END;该例中,显式游标的%ROWCOUNT属性可获取到最近一次移动后已经取到的行数。通过该行数可循环获取到表中前5行的数据。运行结果如右图。2.动态游标
动态游标是在执行部分打开游标时才指定查询语句。动态游标的移动和关闭操作与显式游标完全相同。(1) 定义动态游标
(2) 打开动态游标
在OPEN时通过FOR子句指定与其关联的查询语句。
CURSOR<游标名>;OPEN<游标名><FOR查询语句>;[任务实施]
本任务需要完成用户当月的用电量和电费计算。1.技术分析(1) 因涉及查询当月每个用户的用电量,需使用分组查询。(2) 使用循环语句和动态游标,移动游标读取当月每个用户的用电量。(3) 使用IF分支语句判断用户用电量处于哪个档次,从而计算其阶梯电价费用。[任务实施]2.实现步骤(1)声明:定义变量(用%TYPE绑定列类型)和动态游标。(2)赋值(执行部分):从T_ELECTRICITYPRICE查询阶梯电价额度及单价,赋给变量。(3)游标循环计算(执行部分):打开游标,查询当月各账户用电量;遍历游标,逐户获取账户ID和用电量;通过分支结构计算阶梯电费,输出结果;读取完毕,关闭游标。用户当月的用电量和电费计算[任务测试]任务编码完成后,运行结果可显示当前月份每个用户的用电量及电费。
评价指标评价标准分值得分定义变量能按要求定义所需变量及游标10查询阶梯电价的每月的用电额度和电费单价查询结果正确,并将结果赋给相应变量15打开游标,指定关联查询语句正确书写游标关联的查询语句15循环体内,采用分支结构计算每个用户的阶梯电价费用并输出正确书写循环语句和分支结构语句,理解每次移动游标获取数据后的处理操作30能成功运行正确显示当前月份每个用户的用电量及电费30定义变量能按要求定义所需变量及游标10任务评价表【任务思考】1)定义变量和动态游标的语句能否不放在DECLARE声明部分?2)语句中采用了LOOP循环语句循环处理每一个用户的数据,能否改为WHILE语句实现呢?感谢聆听,下次再见!Thanksforlisteningandseeyounexttime!《数据库原理与应用》任务4.2使用视图查询各地区各街道每日总用电量和供电量项目4:数据库编程主讲人:汪菊琴第13讲一张虚拟的表—视图本任务使用视图创建获取各地区各街道每日总用电量和供电量的视图,方便每次查询。通过视图,查询显示用电日期、区域名称、街道名称、街道总用户数、总用电量和总供电量。素质目标能力目标知识目标1)理解视图的概念和作用。2)掌握视图的创建、使用和删除。1)能够使用视图简化数据查询操作。1)培养化繁为简、模块化设计的系统思维。2)培养节约用电的意识。4.2.1视图概述视图是从数据库中一个或多个表(或视图)中导出来的表,其关联的数据由SQL语句定义。它是一个虚表。视图与表一样由行和列组成,但它不存储实际的数据内容,当使用视图查询数据时,数据库系统会从视图引用的表中提取相应的数据。4.2.1视图概述视图虽然简单,但却是一个十分有用的工具,在实际开发中得到广泛的应用定制数据可针对不同的需要,建立相应的视图。能够实现让不同的用户以不同的方式看到不同或相同的数据。安全性屏蔽某些数据,只赋予特定的用户查看特定数据的权限限制对其他数据的访问和修改,从而保障数据的安全简单性视图可以简化对数据的理解,也可以简化对数据的操作。将经常使用的查询定义为视图,简化查询语句的编写。4.2.2创建视图说明:模式名指明被创建的视图属于哪个模式,默认为当前模式。视图名指明被创建的视图的名称。列名指明被创建的视图中列的名称。列名不得同名,且个数必须与查询说明中SELECT后列的个数相等。若使用与基表或视图中相同的列名,则可以省略列名列表。当视图名已存在时,若指定ORREPLACE,则使用新视图替换原同名视图;若指定IFNOTEXISTS,则忽略本次视图创建操作;若同时指定ORREPLACE和IFNOTEXISTS,则按照ORREPLACE的策略执行;若均不指定,则报错。CREATE[ORREPLACE][FORCE]VIEW[IFNOTEXISTS][<模式名>.]<视图名>[(<列名>{,<列名>})]AS<查询说明>[WITH[LOCAL|CASCADED]CHECKOPTION]|[WITHREADONLY];4.2.2创建视图说明:FORCE选项用于强制创建视图。指定FORCE时,基表可以不存在,此时创建视图不报错,但是会报警告,并且创建的视图处于无效状态。WITHCHECKOPTION选项用于可更新视图中,指明往该视图中插入或更新数据时,插入行或更新行的数据必须满足视图定义中查询说明所指定的条件。如果没有该选项,可不必慢满足。LOCAL|CASCADED选项是基于当前视图是根据另一个视图定义的情况。当通过视图向基表中插入或更新数据时,指定LOCAL,要求数据必须满足当前视图定义中查询说明所指定的条件;指定CASCADED,数据必须满足当前视图以及所有相关视图定义中查询说明所指定的条件。WITHREADONLY选项指明该视图是只读视图,只可以查询,但不可以做其他DML操作;如果不带该选项,则根据DM自身判断视图是否可更新的规则进行判断是否只读。CREATE[ORREPLACE][FORCE]VIEW[IFNOTEXISTS][<模式名>.]<视图名>[(<列名>{,<列名>})]AS<查询说明>[WITH[LOCAL|CASCADED]CHECKOPTION]|[WITHREADONLY];4.2.2创建视图【例4-15】创建视图V_USER_INFO,通过该视图能显示用户编码、用户姓名、所属街道名、所属区域名。CREATEVIEWV_USER_INFOAS SELECTUSER_I,USER_NAME,COMMUNITY_NAME,AREA_NAME FROMEPDMS.T_USERINFOT1 INNERJOINEPDMS.T_COMMUNITYT2ONT1.COMMUNITY_ID=T2.COMMUNITY_ID INNERJOINEPDMS.T_AREAT3ONT2.AREA_ID=T3.AREA_ID;4.2.3使用视图与表基本相同:通常可以用在Select语句中使用表的任何地方。注意:使用视图查询数据时,用到的字段名是在定义视图时指定的字段名,而不是基表中的字段名。4.2.3使用视图【例4-16】用例4-15中创建的视图V_USER_INFO查询所属街道名为“清名桥街道”的用户信息。SELECT*FROMEPDMS.V_USER_INFO4.2.3使用视图【例4-17】创建视图V_USER_CONSUME,该视图使用例1中创建的视图V_USER_INFO和用户用电表T_CONSUME查询每个用户的每天的用电量,包括用户编码、用户姓名、所属街道名、所属区域名、用电日期和用电量。CREATEVIEWV_USER_CONSUMEAS SELECTT1.USER_ID,USER_NAME,COMMUNITY_NAME,AREA_NAME,T2.CONSUME_DATE,T2.CONSUME_NUM FROMEPDMS.V_USER_INFOT1 INNERJOINEPDMS.T_CONSUMET2ONT1.USER_ID=T2.USER_ID;4.2.4管理视图达梦数据库没有提供专门修改普通视图的语句,如需修改视图,可通过图形化界面的方式修改。视图可以重新编译或者删除。1.编译视图重新编译视图的语法格式如下:该语句只是对视图的定义重新进行分析和编译,如果编译出错,可判断视图依赖的基表是否已被删除或修改了表定义。【例4-18】重新编译视图V_USER_CONSUME。ALTERVIEW[<模式名>.]<视图名>COMPILE;ALTERVIEWEPDMS.V_USER_CONSUMECOMPILE;4.2.4管理视图2.删除视图视图被创建后将永久存在,除非将其删除。删除视图语句语法格式如下:说明:若指定IFEXISTS关键字,则删除不存在的视图也不会报错。RESTRICT|CASCADE选项,RESTRICT为默认选项。若配置文件DM.INI中DROP_CASCADE_VIEW=1,则删除有依赖视图的对象时必须使用CASCADE才能连带删除全部依赖视图,否则操作失败;若该参数为0,则RESTRICT和CASCADE效果相同,均仅删除当前视图,不删除其依赖视图。【例4-19】删除视图V_USER_CONSUME。DROPVIEW[IFEXISTS][<模式名>.]<视图名>[RESTRICT|CASCADE];DROPVIEWEPDMS.V_USER_CONSUME;[任务实施]本任务使用视图创建获取各地区各街道每日总用电量和供电量的视图,方便每次查询。1.技术分析(1) 用户每日用电量数据存储在T_CONSUME表中,街道每日供电量存储在T_SUPPLY表中,两张表没有主外键关联,无法直接连接查询,需要先连接其他表查询后,再进行连接查询。为使实现过程更清晰,本任务可先创建用电量视图和供电量视图,最后在两者基础上再创建总的视图。(2) 创建用电量视图,查询每日各地区各街道的用户数和总用电量。(3) 创建供电量视图,查询每日各地区各街道的供电量。(4) 基于用电量视图和供电量视图,创建总视图,查询每日各地区各街道的总用电量和供电量。(5) 使用总视图,查询指定日期各地区各街道的数据。[任务实施]本任务使用视图创建获取各地区各街道每日总用电量和供电量的视图,方便每次查询。2.实现步骤(1) 创建用电量视图V_COMMUNITY_CONSUME,查询每日各地区各街道的用户数和总用电量。(2) 创建供电量视图V_COMMUNITY_SUPPLY,查询每日各地区各街道的供电量。(3) 使用(1)、(2)步中的视图作为基表,创建总视图V_CONSUME_SUPPLY,查询每日各地区各街道的总用电量和供电量。(4) 使用总视图V_CONSUME_SUPPLY,查询日期为“2024-06-26”的各地区各街道的总用电量和总供电量。创建获取各地区各街道每日总用电量和供电量的视图[任务测试]
使用总视图V_CONSUME_SUPPLY,查询日期为“2024-06-26”的各地区各街道的总用电量和总供电量,包括日期、地区名称、街道名称、街道总用户数、总用电量和总供电量。
测试代码如下。SELECTELECTRICITY_DATE,AREA_NAME,COMMUNITY_NAME,USER_NUM,CONSUME_NUM,SUPPLY_NUMFROMEPDMS.V_CONSUME_SUPPLYWHEREELECTRICITY_DATE='2024-06-26';[任务测试]
运行结果可显示“2024-06-26”的各地区各街道的总用电量和总供电量。评价指标评价标准分值得分创建用电量视图正确创建视图,查询所需用电量数据20创建供电量视图正确创建视图,查询所需供电量数据20创建总视图理解连接条件的含义,正确创建视图,查询所需每日各地区各街道的总用电量和供电量40使用视图查询正确查询某个日期的各地区各街道的总用电量和供电量20任务评价表【任务思考】1)如果用电量视图的基表中的数据发生了变化,总视图中的数据会自动变化吗?为什么?2)本任务使用了多层视图的设计,如果要实现同样的查询功能,还能有其他实现方法吗?感谢聆听,下次再见!Thanksforlisteningandseeyounexttime!《数据库原理与应用》任务4.3使用存储函数查询某个用户某个月份的电费项目4:数据库编程主讲人:汪菊琴第14讲数据库模块化设计—函数任务4.1中已经实现了计算每户每月的用电量及电费的功能,本任务使用存储函数的方式进一步实现查询某个用户某个月份的电费。查询“1000000001”用户“2024-07”月份的电费素质目标能力目标知识目标1)了解DM数据库中存储模块的含义和优点。2)掌握DM数据库常用的内置函数和使用方法。3)掌握存储函数的创建、调用和管理。1)能够根据需求选择合适的内置函数。2)能够创建满足业务需求的存储函数并调用。1)培养模块化设计和代码复用的工程思维。存储模块是指由用户使用DMSQL程序语言创建的存储过程或存储函数。它们是预先编译并存储在数据库中的可重用SQL代码块,运行在服务器端。4.3.1存储模块执行效率高:在创建时编译,后续调用直接执行,减少SQL解析时间。调用时,客户端只需传递参数,避免传输大量SQL语句,可降低网络传输。提高代码可维护性:用户定义的存储模块在达梦数据库中集中存放,其业务逻辑集中管理,修改时只需调整存储模块,无需更改应用程序代码。增强数据安全性:可将用户与具体的内部数据操作进行隔离。管理员可限制用户仅能通过存储模块访问数据,避免直接操作表。
4.3.2DM数据库常用内置函数数值函数字符串函数日期时间函数空值判断函数类型转换函数数值函数函数名功能简要说明ABS(n)返回数值n的绝对值CEIL(n)返回大于或等于n的最小整数(向上取整)FLOOR(n)返回小于或等于n的最大整数(向下取整)ROUND(n[,d])将n四舍五入保留d位小数,d默认值为0MOD(m,n)返回m除以n的余数(取模运算)POWER(m,n)返回m的n次幂SQRT(n)返回n的平方根(n必须为非负数)SIGN(n)返回n的符号,正数返回1,负数返回-1,0返回0TRUNC(n[,d])截断n保留d位小数,不进行四舍五入,d默认值为0RAND([seed])返回0到1之间的随机数,seed为可选的种子值表4-1常用数值函数2.字符串函数函数名功能简要说明SUBSTRING(str,pos,len)从str的pos位置开始截取长度为len的子串(pos从1开始)LENGTH(str)返回字符串str的长度(按字符数计算)CONCAT(str1,str2[,...])拼接多个字符串为一个字符串LTRIM(str[,trim_str])去除字符串str左侧的指定字符(默认去除空格)RTRIM(str[,trim_str])去除字符串str右侧的指定字符(默认去除空格)TRIM([trim_strFROM]str)去除字符串str首尾的指定字符(默认去除空格)UPPER(str)将字符串str转换为大写LOWER(str)将字符串str转换为小写REPLACE(str,old,new)将str中所有old子串替换为new子串INSTR(str,substr[,pos[,occ]])返回substr在str中从pos位置开始第occ次出现的位置(未找到返回0)LPAD(str,len[,pad_str])用pad_str在str左侧填充,使总长度为len(默认用空格填充)RPAD(str,len[,pad_str])用pad_str在str右侧填充,使总长度为len(默认用空格填充)表4-2常用字符串函数3.日期函数函数名功能简要说明ADD_DAYS(date,n)返回日期加上n天后的新日期ADD_MONTHS(date,n)在输入日期上加上指定的几个月返回一个新日期SYSDATE()返回当前系统日期和时间SYSTIMESTAMP()返回当前系统日期、时间(精确到微秒)及时区DATEADD(datepart,n,date)对date增加n个指定时间单位(如年、月、日等)DATEDIFF(datepart,date1,date2)计算date2与date1之间的指定时间单位差值DAY(date)返回日期中的天数DAYNAME(date)返回日期的星期名称DAYOFMONTH(date)返回日期为所在月份中的第几天DAYOFWEEK(date)返回日期为所在星期中的第几天DAYOFYEAR(date)返回日期为所在年中的第几天DAYS_BETWEEN(date1,date2)返回两个日期之间的天数EXTRACT(时间单位FROMdate)返回日期的年份、月份等数值,时间单位可以是YEAR、MONTH、DAY等TO_CHAR(date[,fmt])将日期型数据按fmt格式转换为字符串TO_DATE(str[,fmt])将字符串按fmt格式转换为日期型表4-3常用日期函数4.空值判断函数函数名功能简要说明COALESCE(n1,n2,…nx)返回第一个非空的值IFNULL(n1,n2)当n1为非空时,返回n1;若n1为空,则返回n2ISNULL(n1,n2)当n1为非空时,返回n1;若n1为空,则返回n2NULLIF(n1,n2)如果n1=n2返回NULL,否则返回n1表4-4空值判断函数5.类型转换函数函数名功能简要说明CAST(exprAStype)将expr转换为指定的数据类型type(如数值转字符串、日期转字符串等)TO_CHAR(n[,fmt])将数值n按fmt格式转换为字符串TO_NUMBER(str[,fmt])将字符串str按fmt格式转换为数值型TO_DATE(str[,fmt])将字符串按fmt格式转换为日期型(同日期函数中的TO_DATE)TO_TIMESTAMP(str[,fmt])将字符串按fmt格式转换为带时区的时间戳类型CONVERT(expr,type)与CAST类似,将expr转换为指定类型(兼容特定数据库语法)表4-5类型转换函数【例4-20】以年月日格式输出当前日期。--提取当前日期的年、月、日并格式化4.3.2DM数据库常用内置函数SELECTTO_CHAR(SYSDATE,'YYYY-MM-DD')AS年月日格式FROMDUAL;1.创建存储函数语法格式如下:CREATEFUNCTION[<模式名>.]<存储函数名> [(<参数名><参数模式><参数类型>[<默认值表达式>{,…})]RETURN<返回数据类型><AS|IS> [<声明部分>]BEGIN <执行部分>END[存储函数名];4.3.3创建和调用存储函数1.创建存储函数格式说明:模式名:指明被创建的存储函数所属模式的名字,默认为当前模式名。存储函数名:指明被创建的存储函数的名字。参数模式:可设置为IN、OUT或INOUT(OUTIN),默认为IN类型。IN表示输入参数,用来将数据传送给函数;OUT表示输出参数,用来从模块返回数据到进行调用的模块;INOUT表示既作为输入参数,也作为输出参数。返回数据类型:指明存储函数返回值的数据类型。AS|IS:达梦数据库为了兼容不同数据库产品的语法而提供的两种形式,在使用上没有实质性区别。函数体:从声明部分到函数定义结束处为存储函数的函数体,也即语句块。4.3.3创建和调用存储函数2.调用存储函数语法格式如下: [<模式名>.]<存储函数名>[(<参数>)]
存储函数的调用可以出现CALL语句后,也可以出现在SELECT语句中。两者的区别是:跟在CALL语句后调用时,不会返回存储函数的返回值,仅执行其中的操作。通过SELECT语句调用存储函数时,不仅执行其中的操作,也会返回存储函数的返回值。但SELECT语句调用的存储函数不支持含有OUT、INOUT模式参数。4.3.3创建和调用存储函数【例4-21】创建存储函数F_CONSUME_AVG,计算每日平均用电量。再调用该函数输出每日平均用电量。(1)创建计算每日平均用电量的存储函数F_CONSUME_AVG。4.3.3创建和调用存储函数CREATEFUNCTIONEPDMS.F_CONSUME_AVG()RETURNDECIMAL(20,2)ASv_avgDECIMAL(20,2);BEGINSELECTAVG(CONSUME_NUM)INTOv_avgFROMEPDMS.T_CONSUME;RETURNv_avg;END;【例4-21】创建存储函数F_CONSUME_AVG,计算每日平均用电量。再调用该函数输出每日平均用电量。(2)调用F_CONSUME_AVG函数输出每日平均用电量。
调用无参函数时,也可省略函数名后的括号。该SELECT语句执行后,显示每日平均用电量为150.71。也可采用CALL语句调用,能成功运行,但不会输出每日平均用电量。4.3.3创建和调用存储函数SELECTEPDMS.F_CONSUME_AVG()AS每日平均用电量;CALLEPDMS.F_CONSUME_AVG();【例4-22】创建存储函数F_CONSUME_AVG_USER,根据参数用户编号计算该用户每日平均用电量。再调用该函数输出编号“1000000001”用户的每日平均用电量。(1)创建计算某个用户每日平均用电量的存储函数,该函数带有用户编号的参数。(2)调用F_CONSUME_AVG_USER函数输出“1000000001”用户的每日平均用电量。4.3.3创建和调用存储函数CREATEFUNCTIONEPDMS.F_CONSUME_AVG_USER(u_idVARCHAR(20))RETURNDECIMAL(20,2)ASv_avgDECIMAL(20,2);BEGINSELECTAVG(CONSUME_NUM)INTOv_avgFROMEPDMS.T_CONSUMEWHEREUSER_ID=u_id;RETURNv_avg;END;SELECTEPDMS.F_CONSUME_AVG_USER('1000000001')AS每日平均用电量;1.编译存储函数语法格式如下:ALTERFUNCTION[<模式名>.]<存储函数名>COMPILE[CASCADE][DEBUG];说明:当指定CASCADE后,将级联重新编译所有直接或间接引用该存储模块的对象,建议谨慎使用。语法中的DEBUG没有实际作用,仅语法支持。该语句只是对视图的定义重新进行分析和编译,如果编译出错,可判断视图依赖的基表是否已被删除或修改了表定义。【例4-23】重新编译存储函数F_CONSUME_AVG_USER。4.3.4管理存储函数ALTERFUNCTIONEPDMS.F_CONSUME_AVG_USERCOMPILE;2.删除存储函数语法格式如下:DROPFUNCTION[IFEXISTS][<模式名>.]<存储函数名>;【例4-24】删除存储函数F_CONSUME_AVG_USER。4.3.4管理存储函数DROPFUNCTIONEPDMS.F_CONSUME_AVG_USER;[任务实施]
本任务使用存储函数的方式进一步实现查询某个用户某个月份的电费。1.技术分析(1) 创建带参数的存储函数:参数为用户编号和查询月份。(2) 调用带参数的存储函数。[任务实施]2.实现步骤(1) 创建电费计算存储函数F_GET_CONSUMEMONEY,函数带有用户编号和查询年月两个参数,返回类型为DECIMAL(10,2)。(2) 编写存储函数函数体的声明部分,进行变量的定义。(3) 编写存储函数函数体的执行部分,从电力计费表中查询阶梯电价的每月的用电额度和电费单价,并赋给相应的变量。代码同任务4.1【任务实施】中实现步骤的第(2)步。(4) 写查询语句。将参数用户编号和查询年月作为查询条件,并将查询到的用电量总和赋给相应变量。(5) 根据查询到的用电量总和,采用分支结构计算阶梯电价费用。(6) 返回电价费用。查询某个用户某个月份的电费[任务测试]
任务编码完成后运行代码,并调用该函数函数,如需计算“1000000001”用户在“2024-07”月份的电费,调用代码如下。
可查询电费如下:
SELECTEPDMS.F_GET_CONSUMEMONEY('1000000001','2024-07’);评价指标评价标准分值得分定义电费计算存储函数的参数及返回类型正确定义函数的参数个数、参数类型及返回类型20编写函数体正确编写函数体,包含变量声明和执行部分代码40能成功定义函数正确创建电费计算存储函数20调用函数正确编写调用语句,并能正确显示某用户某月的电费20任务评价表【任务思考】1)与任务4.1直接在SQL语句中编写复杂的计算逻辑相比,使用存储函数有哪些优点?2)调用函数时,如果传入一个非预期的参数(如NULL值或非法值),调用结果会怎样?如何通过异常处理来增强函数的容错能力?感谢聆听,下次再见!Thanksforlisteningandseeyounexttime!《数据库原理与应用》任务4.4使用存储过程实现供电申请和审批项目4:数据库编程第15讲数据库编程核心—存储过程主讲人:汪菊琴本任务使用存储过程实现电力调度中的申请供电和审批供电流程。申请供电是由当地电网分局工作人员根据街道当天用电量的1.2倍申请第二天的用电量。审批供电是由当地电网总局工作人员审批各街道的供电申请,如通过,则第二天根据申请电量供电。素质目标能力目标知识目标1)掌握存储过程的创建、调用和管理。2)掌握存储过程的参数类型(IN、OUT、INOUT)及使用方法。3)理解存储过程和存储函数的区别。1)能够创建存储过程实现业务需求。2)能够管理存储过程。1)培养模块化设计和代码复用的工程思维。2)树立用电安全意识
存储过程(StoredProcedure)是达梦数据库中存储模块中的一种。它是预编译并存储在数据库中的一组SQL语句集合,可被重复调用。
存储过程是数据库中的一个重要对象。它可以封装复杂业务逻辑,实现批量数据处理、事务控制等操作。4.4.1创建和调用存储过程1.创建存储过程4.4.1创建和调用存储过程语法格式如下:CREATEPROCEDURE[<模式名>.]<存储过程名>[(<参数名><参数模式><参数类型>[<默认值表达式>{,…})]<AS|IS>[<声明部分>]BEGIN<执行部分>END[存储过程名];2.调用存储过程4.4.1创建和调用存储过程语法格式如下:CALL[<模式名>.]<存储函数名>[(<参数>)];或:[<模式名>.]<存储函数名>[(<参数>)];存储过程的参数4.4.2存储过程的参数无参有参输入型:用IN关键字修饰(默认)输出型:用OUT关键字修饰输入输出型:用INOUT关键字修饰{{1.创建无参存储过程【例4-25】用存储过程实现任务4.3中例4-21中计算每日平均用电量的功能。要求创建存储过程P_CONSUME_AVG,计算每日平均用电量。再调用该存储过程输出每日平均用电量。4.4.2存储过程的参数1.创建无参存储过程(1)创建计算每日平均用电量的存储过程P_CONSUME_AVG。(2)调用P_CONSUME_AVG存储过程输出每日平均用电量。4.4.2存储过程的参数
存储过程命名时,建议以“P_”或者“PROC_”作为前缀,方便和其它对象区分。CREATEPROCEDUREEPDMS.P_CONSUME_AVGASBEGINSELECTTRUNC(AVG(CONSUME_NUM),2)AS每日平均用电量
FROMEPDMS.T_CONSUME;END;CALLEPDMS.P_CONSUME_AVG;2.创建带输入(IN)参数的存储过程【例4-26】用存储过程实现任务4.3中例4-22中根据参数用户编号计算该用户每日平均用电量的功能。要求创建存储过程P_CONSUME_AVG_USER,计算每日平均用电量。4.4.2存储过程的参数2.创建带输入(IN)参数的存储过程(1)创建计算某个用户每日平均用电量的存储过P_CONSUME_AVG_USER。4.4.2存储过程的参数CREATEPROCEDUREEPDMS.P_CONSUME_AVG_USER(u_idINVARCHAR(20))ASBEGINSELECTTRUNC(AVG(CONSUME_NUM),2)AS每日平均用电量FROMEPDMS.T_CONSUME
WHEREUSER_ID=u_id;END;2.创建带输入(IN)参数的存储过程(2)调用存储过程P_CONSUME_AVG_USER,输出“1000000001”用户的每日平均用电量。4.4.2存储过程的参数CALLEPDMS.P_CONSUME_AVG_USER('1000000001');调用存储过程P_CONSUME_AVG_USER时,先将实参''1000000001''传送给形参u_id,然后执行过程体中SELECT语句查询指定编号的用户每日平均用电量。创建带输出(OUT)参数的存储过程【例4-27】用带输出参数的存储过程实现例4-26,要求创建存储过程F_CONSUME_AVG_USER2,计算每日平均用电量,将结果用输出参数返回。4.4.2存储过程的参数3.创建带输出(OUT)参数的存储过程(1)创建计算某个用户每日平均用电量的存储过程P_CONSUME_AVG_USER24.4.2存储过程的参数CREATEPROCEDUREEPDMS.P_CONSUME_AVG_USER2 (u_idINVARCHAR(20),con_sumOUTDECIMAL(20,2))ASBEGIN SELECTAVG(CONSUME_NUM)INTOcon_sum FROMEPDMS.T_CONSUME WHEREUSER_ID=u_id;END;3.创建带输出(OUT)参数的存储过程(2)调用存储过程P_CONSUME_AVG_USER2,输出“1000000001”用户的每日平均用电量。4.4.2存储过程的参数DECLAREv_uidVARCHAR(20):='1000000001';v_con_sumDECIMAL(20,2);--用于接收输出结果的变量BEGIN--调用存储过程
CALLEPDMS.P_CONSUME_AVG_USER2(v_uid,v_con_sum);--打印结果
PRINTv_uid||'用户每日平均用电量为'||v_con_sum||'度';END;调用带有输出参数的存储过程时,对应的实参必须是一个变量。存储过程与存储函数在结构和功能上十分相似,主要差异在于:有无返回值:存储过程没有返回值,调用者只能通过访问OUT或INOUT参数来获得执行结果;而存储函数有返回值,它把执行结果直接返回给调用者。有无返回语句:存储过程可以使用不带返回值的RETURN;语句来提前退出过程体;而存储函数必须通过带返回值的RETURN语句来结束执行并返回结果。返回语句中能否带有表达式:存储过程的返回语句中不能带有表达式,只能是“RETURN;”,而存储函数的返回语句中必须带表达式。调用语句能否出现表达式中:存储过程没有返回值,因此它的调用不能出现在一个表达式中,而存储函数的调用可以出现在表达式中。[任务实施]
本任务使用存储过程实现电力调度中的申请供电和审批供电流程。1.技术分析(1) 根据任务要求,本任务需先创建并调用分局工作人员申请街道供电存储过程,再创建总局工作人员审批供电申请存储过程,最后调用该存储过程,完成供电申请和审批的整个流程。(2) 查询当日街道所辖用户的用电量,需采用内连接,连接用户用电量表、用户账号表和社区街道表。(3) 调用达梦数据库内置函数SYSDATE()、TO_CHAR()、SYS_GUID()和ADD_DAYS()。(4) 使用INSERT插入语句和UPDATE更新语句。[任务实施]2.实现步骤(1)创建分局工作人员申请街道供电存储过程P_APPLY,带有申请街编号和分局工作人员账号编号两个参数。(2)编写申请供电存储过程P_APPLY的过程体。采用内连接连接用户用电量表、用户账号表和社区街道表,查询当日街道所辖用户的用电量并乘以1.2,即为第二天需要申请的供电量,并存入v_supply_num变量。进行错误判断,防止没有查到街道的当日用电数据。在供电量申请表中插入一条申请记录。[任务实施]2.实现步骤(3)创建总局工作人员审批供电申请存储过程P_APPROVAL,带有审批标志、申请街编号和审批工作人员账号编号三个参数。(4)编写总局工作人员审批供电申请存储过程P_APPROVAL的过程体。查询出待审批的供电申请的供电日期和供电量数据,并赋给v_apply_time和v_supply_num变量。判断实参传过来的审批标志flag是否为1,如是,则先更新T_SUPPLYSTATUS表中该条申请的审批标志、审批时间和审批人账号三个字段的值,再向T_SUPPLY表插入第二天的供电量数据。使用存储过程实现供电申请和审批[任务测试]
(1)运行创建申请供电存储过程P_APPLY的代码,并调用P_APPLY。假设编号为'100003'的分局工作人员为'10302'街道申请第二天的供电,代码如下。
调用后,将在供电量申请表中插入一条申请记录。
CALLEPDMS.P_APPLY('10302','100003‘);[任务测试]
(2)运行创建审批供电申请存储过程P_APPROVAL的代码,并调用该过程。假设编号为'100000'的总局工作人员审批通过了'10302'街道第二天的供电申请,代码如下。
CALLEPDMS.P_APPROVAL(1,'10302','100000’);[任务测试]
调用后,会先更新供电量申请表相应申请的相关字段内容。再向供电量表中插入一条新的供电记录。评价指标评价标准分值得分创建申请街道供电存储过程正确运行,成功创建申请街道供电存储过程30调用申请街道供电存储过程正确运行,在供电量申请表中成功插入一条申请记录15创建审批供电申请存储过程理解连接条件的含义,正确创建视图,查询所需每日各地区各街道的总用电量和供电量40调用审批供电申请存储过程正确运行,成功更新供电量申请表,并在供电量表中成功插入一条供电记录15任务评价表【任务思考】1)调用申请供电的存储过程P_APPLY插入数据后,审批供电申请的存储过程P_APPROVAL是如何准确获取需要审批的是哪条数据?2)审批供电申请时,先更新该次申请的状态、审批人和审批时间,再向供电表中插入一条供电信息。如果更新操作没成功,插入操作还能进行吗?该如何避免这这种情况发生?感谢聆听,下次再见!Thanksforlisteningandseeyounexttime!《数据库原理与应用》任务4.5使用触发器记录供电申请的状态变更日志项目4:数据库编程第16讲神奇的触发器主讲人:汪菊琴本任务在EPDMS模式下创建触发器,记录供电申请的状态变更日志。当供电申请状态发生变化时,触发器被触发,并将申请供电编码、变更前状态、变更后状态、操作用户和变更时间记录到操作日志表(新建表)中。素质目标能力目标知识目标1)理解触发器的概念、作用和触发时机。2)掌握各类触发器的创建和管理。3)掌握表触发器中新、旧行值的引用规则。4)熟悉事件触发器和时间触发器的适用场景。1)能够创建满足业务需求的表触发器并正确引用行值。2)能够创建和管理事件触发器、时间触发器。3)能够管理触发器。1)培养数据完整性和业务规则约束的设计思维。2)建立数据库操作安全监控的意识。1.触发器的概念与作用
触发器与存储模块类似,都是在服务器上保存并执行的一段DMSQL程序语句,可用于保证数据完整性。
不同的是,存储模块必须被显式地调用执行,而触发器是在相关的事件发生时,由服务器自动地隐式触发。4.5.1触发器概述1.触发器的概念与作用触发器的作用:利用触发器实现表约束机制无法实现的复杂的引用完整性。利用触发器实现复杂的事务规则。利用触发器维护复杂的默认值。利用触发器实现复杂的审计功能。利用触发器防止非法的操作。4.5.1触发器概述2.触发器的分类在达梦数据库中,触发器根据触发事件主要分为以下三类::1)表触发器:对表中数据操作引发的触发。2)事件触发器:对数据库对象操作引发的触发。3)时间触发器:是一种特殊的事件触发器,在一定的时间频率下触发。其中,使用最广泛的是表触发器。4.5.1触发器概述1.创建表触发器4.5.2 表触发器语法格式如下:说明:触发时机:指BEFORE、AFTER或INSTEADOF关键字。BEFORE指在触发动作之前运行触发器;AFTER指在触发动作之后运行触发器。INSTEADOF仅允许建立在视图上,指在动作触发的时候,替换原始操作。触发事件:指使触发器启动的事件,有INSERT、DELETE和UPDATE三个关键字,代表三种操作。FOREACH:FOREACHROW表示为元组级触发器,它受被触发命令影响、且WHEN子句的表达式计算为真的每条记录执行一次。FOREACHSTATEMENT为语句级触发器,它对每个触发命令执行一次。如不写FOREACH子句,默认为语句级触发器;WHEN(<条件表达式>):表触发器中只允许为元组级触发器指定WHEN子句,
当表达式的值为TRUE时,执行触发器;否则,跳过该触发器CREATETRIGGER[<模式名>.]<触发器名><触发时机><触发事件>ON<表名>[FOREACH{ROW|STATEMENT}][WHEN(<条件表达式>)]BEGIN<触发器执行的DMSQL程序语句>END;1.创建表触发器4.5.2 表触发器【例4-29】BEFORE触发器示例1。运行上面的创建语句后,再执行如下的更新语句。可发现在“消息”窗口输出“更新金额前,请确保金额正确!”的信息,并且该用户金额已被修改。CREATETRIGGEREPDMS.TRG_USERINFO_UPDATE1BEFOREUPDATEOFB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江杭州市保俶塔申花实验学校诚聘语文、数学、体育等学科教师(非事业)备考题库附完整答案详解【名校卷】
- 2026年8月中央广播电视总台文艺节目中心招聘15人考前冲刺试卷附答案详解【夺分金卷】
- 2026天津市宁河区教育局所属中学招聘高层次教育人才1人考前冲刺试卷及参考答案详解(巩固)
- 2026年内蒙古兴安盟招聘教育部直属师范大学公费师范毕业生2人考前冲刺密卷一套附答案详解
- 2026海南琼中黎族苗族自治县计划生育协会招聘公益性岗位人员1人考前冲刺试卷含完整答案详解(历年真题)
- 2026汽车电子轮胎智能监测系统生产总体分析研究报告
- 2026汽车共享运营企业与商业模式创新分析报告
- 2026中国物流企业知识管理系统构建及智力资本积累报告
- 2026农业等相信农业机械服务行业市场现状分析投资评估规划研究报告
- 溃疡性结肠炎造口护理
- 监控系统调试报告
- 2026年下半年浙江金义人才集团有限公司公开招聘工作人员8人笔试备考题库及答案详解
- 2026年中国医师节主题宣传:以德立医魂+以技护生命
- 2026内蒙古乌海市高新工业投资集团有限责任公司招聘工作人员5名(第二批)考试备考题库及答案详解
- 小学道德与法治学科教师专业素质考试试题及答案
- 中药提取原理及基础知识
- 中医针灸学(A1题型)历年真题试卷汇编2
- 政治审查表(模板)
- 食堂设备操作安全培训
- F-1600泥浆泵性能及维护课件
- 湖南省中小学生转学申请表(模板)
评论
0/150
提交评论