版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《数据库原理与应用》任务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属性可获取到最近一次移动后已经取到的行数。通过该行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国云计算人工智能服务平台行业市场现状供需分析及投资评估规划分析研究报告
- 2026中国智能机器人视觉研发行业市场现状供需分析及投资评估规划分析研究报告
- 2026年枣庄台儿庄区教育系统第二批公开招聘教师(5名)笔试题库及参考答案详解【A卷】
- 2026中国中煤能源集团有限公司江苏分公司第1次社会招聘8人考前冲刺密卷及完整答案详解【考点梳理】
- 2026年西安市车辆中学招聘教师(3人)考前冲刺试卷附完整答案详解(易错题)
- 2026内蒙古大学招聘具有硕士学位控制数(非事业编制)工作人员42人考前冲刺试卷附答案详解AB卷
- 2026气候改造产业行业市场现状供需分析及投资评估规划分析研究报告
- 2026四川雅安市汉源县中医医院招聘医生15人笔试题库带答案详解(A卷)
- 2026食品加工速冻食品行业市场供需分析及投资发展前景评估规划研究报告
- 2026中国通信设备产业链竞争格局分析及投资规划
- 2026年上海市杨浦区高三下学期二模化学试卷和答案
- 2026年全国设备监理师(设备工程质量管理与检验)真题及解析
- 广州医科大学药学考研试题及答案
- 东方枢纽集团笔试题
- 2026校招:山东发展投资控股集团面试题及答案
- 居家养老服务中心财务制度及流程
- 中国出血性脑卒中诊疗指南(2025版)
- 五金制程巡查制度规范
- 物业行业安全生产培训课件
- 2026年湖南生物机电职业技术学院单招职业技能测试题库含答案详解
- 中国越南文学课件
评论
0/150
提交评论