实验7PL/SQL编程基础姓名:林丹萍学号:0910012115专业:信息与计算科学班级:09信计1班同组人:无实验日期:2012-5-2【实验目的与要求】掌握PL/SQL基本语法掌握PL/SQL简单存过程的编写【实验内容与步骤】7.0.实验准备工作1.测试用表的创建与数据添加(1).创建测试表CreateTableTESTTABLE(RECORDNUMBERnumber(4)NotNull,CURRENTDATEDateNotNull)TablespaceUSER;--这里的表空间其实可以不去管,这样它就会在当前用户的表空间中创建一个表(2).使用for语句在测试表中加入测试数据DeclaremaxrecordsConstantInt:=100;iInt:=1;BeginForiIn1..maxrecordsLoopInsertIntohqf.testtable(recordnumber,currentdate)--hqf为模式名,应改动Values(i,Sysdate);dbms_output.put_line('现在输入的内容是:'||i||''||Sysdate);Commit;--这里切记要commit否则将不会将数据提交到表中EndLoop;dbms_output.put_line('记录已经按照计划全部插入,请查看!');End;//注:hqf为登录用户名,需根据情况改动,如:实验中一般用scott.(3).查询表中数据,给出查询结果截图:2.导入教材实验数据(1).创建用户school,并赋于相应的权限:CREATEUSERvenditionidentifiedbyvendition;GRANTCREATESESSION,RESOURCE,DBATOvendition;CREATEUSERSCHOOLidentifiedbySCHOOL;GRANTCREATESESSION,RESOURCE,DBATOSCHOOL;(2).将文件夹“TestTableBak”中的备份文件school.DMP和vendition.DMP复制到某一目录下(例如E盘根目)。(3).然后启动CMD命令提示窗口,运行如下的还原命令。impuserid=school/schoolignore=yfromuser=schooltouser=schoolfile=e:\school.DMPimpuserid=vendition/venditionignore=yfromuser=venditiontouser=venditionfile=e:\vendition.DMP(4).验证确认。以用户名School登录系统,查看相应的表,看是否有数据。7.1.最简单的PL/SQL程序1.输出Hello,World/***************************************第一个例子:输出Hello,World***************************************/setserverouton--设置SQL*Plus将服务器所返回的写出来begin--块开始DBMS_OUTPUT.put_line('Hello,World');--在控制台输出信息,类似C语言的Printf或者java语言中的System.out.printend;--块结束运行结果为:1.接收数据并输出/***************************************在此基础上,完成Hello,某某,某某从客户端得到***************************************/declarev_namevarchar2(20);begin--块开始v_name:='&姓名';--与“客户端”交互,类似C语言的scanf语句DBMS_OUTPUT.put_line('Hello,'||v_name);end;--块结束运行结果为:7.2.简单变量的使用1.变量的声明与引用setserveroutputon;--PL/SQL变量之简单类型declarev_dept_idnumber(5):=1111;v_agebinary_integer:=12;v_dept_namevarchar2(20):='人事部';v_rateconstantnumber(4,2):=22.12;v_validbooleannotnull:=TRUE;v_hire_datedatenotnull:=sysdate+7;beginv_dept_id:=2222;dbms_output.put_line(v_dept_id);end;/运行结果为:2.Into子句的使用:DeclareV_deptnonumber(2);v_locvarchar2(15);beginselectdeptno,locintov_deptno,v_locfromdeptwheredname='SALES';DBMS_OUTPUT.PUT_LINE(V_deptno||'and'||v_loc);end;运行结果为:实验练习:编写一PL/SQL程序,实现依次从客户端接收各字段的值,并放于变量中,输完一条记录的所有字段值后,将值写到数据库表Emp中。请给出程序源码:declarev_EMPNONUMBER(4);v_ENAMEVARCHAR2(10);v_JOBVARCHAR2(9);v_MGRNUMBER(4);v_HIREDATEDATE;v_SALNUMBER(7,2);v_COMMNUMBER(7,2);v_DEPTNONUMBER(2);beginv_EMPNO:='&EMPNO';v_ENAME:='&ENAME';v_JOB:='&JOB';v_MGR:='&MGR';v_HIREDATE:='&HIREDATE';v_SAL:='&SAL';v_COMM:='&COMM';v_DEPTNO:='&DEPTNO';insertintoempvalues(v_EMPNO,v_ENAME,v_JOB,v_MGR,v_HIREDATE,v_SAL,v_COMM,v_DEPTNO);end;给出测试结果:3.变量作用域:阅读以下程序,熟悉变量的斌值方法,理解变量的作用,给出运行结果。--嵌套块中的变量赋值和作用域DECLAREv_weightNUMBER(3):=100;v_messageVARCHAR2(255):='OuterValue';BEGINDECLAREv_weightNUMBER(3):=1;v_messageVARCHAR2(255):='Innervalue';BEGINv_weight:=v_weight+1;v_message:='Put'||v_message;DBMS_OUTPUT.PUT_LINE('innerblock'||to_char(v_weight)||v_message);END;v_weight:=v_weight+1;v_message:='Put'||v_message;DBMS_OUTPUT.PUT_LINE('outterblock'||to_char(v_weight)||v_message);END;运行结果为:7.3.使用%type和%rowtype变量1.使用%type变量阅读以下程序,理解其功能,给出运行结果。(1)DROPTABLEEMPL;createtableEMPL(EMPLOYEE_IDNUMBER(5)notnull,LAST_NAMEVARCHAR2(20)notnull,HIRE_DATEDATE,SALARYNUMBER(8,2),JOB_IDNUMBER(5),DEPARTMENT_IDNUMBER(5));setserveroutputon;--PL/SQL变量之%TYPE类型declarev_last_nameemployees.last_name%TYPE;----用户hrv_hire_dateemployees.hire_date%TYPE;v_balancenumber(6,2);v_min_balancev_balance%type;begindbms_output.put_line('定义%type类型的变量');end;/运行结果为:(2)declarev_deptnodept.deptno%type;v_locdept.loc%type;beginselectdeptno,locintov_deptno,v_locfromdeptwheredname='SALES';DBMS_OUTPUT.PUT_LINE(V_deptno||'and'||v_loc);end;/运行结果为:2.使用%Rowtype变量阅读以下程序,理解其功能,给出运行结果。(1)DROPTABLEEMPL;createtableEMPL(EMPLOYEE_IDNUMBER(5)notnull,LAST_NAMEVARCHAR2(20)notnull,HIRE_DATEDATE,SALARYNUMBER(8,2),JOB_IDNUMBER(5),DEPARTMENT_IDNUMBER(5));setserveroutputon;--PL/SQL变量之%ROWTYPE类型declarev_emplemp%rowtype;begindbms_output.put_line('定义%rowtype类型的变量');end;/运行结果为:(2)droptablestock;createtablestock(symbolvarchar2(50),pricenumber(6,2));insertintostockvalues('IBM',188.88);insertintostockvalues('ORCL',100.88);DECLAREstock_info1stock%ROWTYPE;stock_info2stock%ROWTYPE;stock_info3stock%ROWTYPE;BEGIN--对应纪录直接取得相应字段的:PopulatethespecificfieldsinarecordSELECTsymbol,priceINTOstock_info1.symbol,stock_info1.priceFROMstockWHEREsymbol='ORCL';--对应纪录直接放入纪录中SELECT*INTOstock_info2FROMstockWHEREsymbol='ORCL';stock_info3:=stock_info2;--记录间可以相互赋值stock_info3.symbol:='ORACLE';--对纪录的各字段赋值。DBMS_OUTPUT.PUT_LINE('stock_info1:'||stock_info1.symbol||''||stock_info1.price);DBMS_OUTPUT.PUT_LINE('stock_info2:'||stock_info2.symbol||''||stock_info2.price);DBMS_OUTPUT.PUT_LINE('stock_info3:'||stock_info3.symbol||''||stock_info3.price);END;运行结果为:思考:如下所示:改变表结构。droptablestock;createtablestock(symbolvarchar2(50),pricenumber(6,2),ownervarchar2(10));对以上程序运行有影响吗?为什么?没有影响,因为程序中没有使用到增加的那个字段.7.4.条件判断语句的使用阅读并理解以下程序,调试并给出运行结果。1.If语句:droptableemployee;createtableemployee(empnonumber(4),namevarchar2(30),salarynumber(8,2));insertintoemplo