《DatabaseSystemConcept》实验指导实验一PL/SQL开发环境的使用[实验目的]1.掌握建立本地Net服务名(TNS)的方法;2.熟悉和掌握使用SQLPlus工具操作数据库;3.熟悉TOAD工具。[实验内容]1.使用Oracle的TNS配置程序建立本地服务名;a.运行Oracle的TNS配置程序;(程序里面的oracle目录下的NetConfigurationAssistant)b.输入远程数据库服务名——orcl1;c.输入远程数据库IP地址(192.168.0.28)和端口(1521);d.使用自己的学号作为登陆帐户和密码测试;e.输入一个自己容易记住的名字命名TNS,如orcl之类的。f.完成配置。2.使用SQLPlus工具登陆远程数据库;a.运行Oracle的SQLPlus工具;b.使用自己的学号作为用户名和密码,主机字符串为刚才自己配置的TNS登陆;c.记录程序信息;d.键入“createtabletaba(colaint,colbint);”,记录SQL语句运行结果;e.键入“insertintotabavalues(1,1);”,记录SQL语句运行结果;f.键入“commit;”,提交插入操作;g.退出应用程序。3.在命令行下使用SQLPlus登陆远程数据库;a.点击运行菜单(或者按Win+R键);b.输入cmd;c.在命令行窗口下输入sqlplus用户名/密码@TNS,如sqlplusscott/tiger@orcl;d.记录程序信息;e.键入“select*fromtaba;”,记录SQL语句运行结果;f.退出程序。4.使用TOAD工具登陆远程数据库。a.运行TOAD程序(双击桌面的青蛙图标);b.选择刚才设定的TNS,使用自己的学号作为帐户和密码登陆;c.打开SQLEditer,键入“select*fromtaba;”,按F9,记录SQL运行结果;d.退出程序。[实验报告]1.记录所有的操作和操作结果;2.比较三种不同方式使用数据库的不同。实验二DDL中的表操作[实验目的]1.熟悉和掌握SQL的CreateTable,DropTable,AlterTable语句语法;2.熟悉和掌握SQLPlus或TOAD等开发工具;3.学会建立主键,外键,Check约束,[预备知识]1.掌握登陆远程数据库方法;2.掌握至少一种OraclePL/SQL开发工具的使用;3.PL/SQL中CreateTable,DropTable,AlterTable语句语法。[实验内容]1.建表1)按照下面的数据库模型图,使用CreateTable语句或使用TOAD的建表工具建立对应的表(只要建立表名及对应的表项即可),记录建表的SQL语句。图1.BankDemo数据库模型2.建立主键约束1)运行下列SQL语句:insertintobranchvalues(‘XiangtanUniversity’,’Xiangtan’,4000000);insertintobranchvalues(‘XiangtanUniversity’,’Xiangtan’,5000000);2)以上两条SQL是否成功执行?3)在Branch表建立以Branch_name列的主键,是否成功?4)运行deletebranch;5)再在Branch表建立以Branch_name列的主键,是否成功?6)再运行步骤1中的两条SQL语句,记录数据操作结果。7)建立图1中所有表的主键。3.建立外键约束1)建立图1中的所有的外键约束;2)运行“insertintoloanvalues(1,’RainLake’,1000)”,出现了什么问题?3)运行“insertintoloanvalues(1,’XiangtanUniversity’,1000)”,记录运行结果;4)比较两个操作,思考以上操作有什么区别?4.建立Check约束1)在account表上的balance列上建立一个check约束,使得balance不会小于0;2)运行“insertintoaccountvalues(1,’XiangtanUniversity’,-1)”,记录运行结果。[实验报告]1.保留所有建表,约束的SQL脚本文件;2.保留操作记录;3.表定义主键约束对于表列的要求?4.表定义外键约束对于表列的要求?5.如果要控制表列是否可以为空,使用那种方式定义这个约束较好?为什么?实验三DML和视图[实验目的]1.熟练掌握select,insert,update,delete语句的使用;2.掌握建立view的语法;3.理解外部连接的含义;[预备知识]1.PL/SQL中的Select,Insert,Update,Delete语句2.CreateView语句3.TOAD的使用[实验内容]1.请在对应表中插入如下的数据Branch(分行表)Customer(顾客表)Account(存款账号表)Depositor(顾客-存款账号表)Loan(借款表)Borrower(顾客-借款表)2.请完成下列查询(只允许使用一条SQL命令)a.查询所有customer_city为’Rye’的顾客姓名。b.查询所有在Horseneck城市的银行中存过钱的顾客姓名。c.查询所有借款的借款人姓名,借款分行,分行所在城市,借款金额。d.查询各分行的分行名称,总放贷金额,并按金额降序排序。e.查询所有顾客的顾客姓名,存款总额,贷款总额,并按顾客姓名升序排序。3.请完成下列的更新操作a.将L-17号借款人改为Smith;b.将所有Perryridge分行的存款(account表)的金额加上5%的利息;c.将Smith所有的借款金额都减少一半;d.将Hayes在Downtown的存款额改为其在Perryridge的存款金额。(假设同一位顾客在同一个分行只有一个账户)4.请完成下列的删除操作a.删除用户Greenb.清除Hayes的所有借款5.建立下列视图a.对于DeerPark支行的所有账户,建立一个包含账户和客户名的视图。b.包含所有在银行有账户但没有贷款的客户的姓名和地址的视图。c.对于RockRidge支行的每个客户,建立一个包含姓名和平均账户余额的视图。[实验报告]1.记录所有操作的SQL脚本和查询结果2.记录操作中出现的问题和解决办法3.检查自己的操作是否正确4.视图的作用是什么?实验四程序块[实验目的]1.理解PL/SQL程序块的结构;2.理解和掌握PL/SQL分支,循环语句的使用;3.理解PL/SQL的异常处理;4.掌握DBMS_OUTPUT包中PUT_LINE函数在调试中的应用。[预备知识]1.PL/SQL程序设计的基本语句2.DBMS_OUTPUT包[实验原理]1.PL/SQL的程序块结构DECLAREBEGINEXCEPTION声明可执行语句END;例外处理程序PL/SQL程序块的一部分2.PL/SQL的基本语句a.变量声明v_strvarchar2(200);b.分支语句ifi=2thenj=1;elsej=2;endif;c.循环语句j:=0;foriin1..10loopj:=j+i;endloop;3.DBMS_OUTPUT包DBMS_OUTPUT中使用最多的是两个函数PUT和PUT_LINE,相当于打印函数。PUT_LINE表示输出一行,PUT表示连续输出。[实验内容]1.编写下列的程序块,打开DBMS_OUTPUT,查看输出结果declarestrvarchar2(4000);cvarchar2(1);cntint;iint;lenint;tagboolean;beginstr:='databasesystemconcept';len:=length(str);cnt:=0;tag:=true;foriin1..lenloopc:=substr(str,i,1);iftagand(cbetween'a'and'z'orcbetween'A'and'Z')thentag:=false;cnt:=cnt+1;elsifnottagandnot(cbetween'a'and'z'orcbetween'A'and'Z')thentag:=true;endif;endloop;DBMS_OUTPUT.PUT_LINE('Thereare'||to_char(cnt)||'word(s)inthestringof'''||str||'''.');end;修改str的赋值,运行程序看看结果。2.编写一个程序块,判断给定的一个数是否是素数,并输出判断结果。3.依据实验三中的表,编写一个程序块,根据给定用户名,如果用户的存款总额小于400,则输出这个用户为’BronzeCoustomer’;如果用户存款总额大于400,小于700,则输出这个用户为’SilverCoustomer’;如果用户存款总额大于700,则输出这个用户为’GoldenCoustomer’。提示:使用selectinto将查询的金额总数赋值给一个变量,然后判断输出。a.先测试一个用户表中存在的用户,记录结果。b.再测试一个用户表中不存在的用户,会出现什么问题?c.修改这个程序,使用异常处理,处理NO_DATA_FOUND异常,输出’Nosuchcoustomer!’。[实验报告]1.第一个程序的运行结果和含义。2.第二个程序的脚本文件和运行测试结果。3.第三个程序的脚本文件和运行测试结果。实验五游标[实验目的]1.了解和掌握游标的使用;2.了解和掌握使用循环处理游标的技术;3.熟悉和巩固PL/SQL程序设计。[预备知识]1.PL/SQL程序块的设计2.游标的声明,打开,读取,关闭3.循环处理[实验原理]1.游标的声明可以通过在PL/SQL程序块的声明部分命名游标,将它与某个查询关联来定义一个游标CURSOR游标名ISSELECTstatement;示例CURSORemp_curISSELECTempno,ename,job,salFROMemp;2.游标的操作a.open游标OPEN游标名示例OPENemp_cur;b.fetch游标FETCH游标名INTOvar1,…,varN;或者FETCH游标名INTOrecord_variable;示例FETCHemp_curINTOmrec;c.close游标CLOSE游标名;示例CLOSEemp_cur;3.游标的属性a.%NOTFOUND如果因为没有多行而使最后的FETCH失败,则判定为TRUE;如果最后的FETCH返回一行,则判定为FALSE。b.%FOUND如果最后的FETCH返回一行,则判定为TRUE;如果因为没有多行而使最后的FETCH失败,则判定为FALSE。c.%ROWCOUNT返回当前从活动集合获取的行数d.%ISOPEN如果打开显示游标,则判定为TRUE;如果关闭显示游标,则判定为FALSE。4.使用循环处理游标,下面的例程中c_class为游标,v_class为游标列变量,即类型为c_class%rowtype;a.简单循环openc_class;loopfetchc_classintov_class;exitwhenc_class%notfound;…endloop;closec_class;b.while循环openc_class;fetchc_classintov_class;whilec_class%foundloop…fetchc_classintov_class;endloop;closec_class;c.for循环forv_classinc_classloop…endloop;[实验内容]1.依据实验三的表,编写一个程序,将读取所有的借款,借款额大于1500,则将这个借款额增加5%;如果借款额大于800,小于等于1500,则将这个借款增加8%;如果借款额小于80,则将这个借款增加80。2.先查询借款表,记录借款表的数据;运行这个程序,然后再查询借款表,看看结果。[实验报告]1.程序的脚本和程序运行的效果。2.游标的使用中碰到的问