大型数据库技术实验7
- 格式:doc
- 大小:414.00 KB
- 文档页数:19
实验7PL/SQL编程基础姓名:学号:专业:班级:同组人:无实验日期:【实验目的与要求】⏹掌握PL/SQL基本语法⏹掌握PL/SQL简单存过程的编写【实验内容与步骤】7.0.实验准备工作1. 测试用表的创建与数据添加(1).创建测试表Create Table TESTTABLE(RECORDNUMBER number(4) Not Null,CURRENTDATE Date Not Null)Tablespace "USER" ;--这里的表空间其实可以不去管,这样它就会在当前用户的表空间中创建一个表(2).使用for语句在测试表中加入测试数据Declaremaxrecords Constant Int:=100;i Int:=1;BeginFor i In 1..maxrecords LoopInsert Into hqf.testtable(recordnumber,currentdate) --hqf为模式名,应改动Values(i,Sysdate);dbms_output.put_line('现在输入的内容是:'||i||' '||Sysdate);Commit; --这里切记要commit否则将不会将数据提交到表中End Loop;dbms_output.put_line('记录已经按照计划全部插入,请查看!'); End;//注:hqf为登录用户名,需根据情况改动,如:实验中一般用scott.(3).查询表中数据,给出查询结果截图:2. 导入教材实验数据(1).创建用户school,并赋于相应的权限:CREATE USER venditionidentified by vendition;GRANT CREATE SESSION,RESOURCE,DBATO vendition;CREATE USER SCHOOLidentified by SCHOOL;GRANT CREATE SESSION,RESOURCE,DBATO SCHOOL;(2).将文件夹“TestTableBak”中的备份文件school.DMP和vendition.DMP复制到某一目录下(例如E盘根目)。
(3).然后启动CMD命令提示窗口,运行如下的还原命令。
imp userid=school/school ignore=y fromuser=school touser=school file=e:\school.DMPimp userid=vendition/vendition ignore=y fromuser=vendition touser=venditionfile=e:\vendition.DMP(4).验证确认。
以用户名School登录系统,查看相应的表,看是否有数据。
7.1.最简单的PL/SQL程序1.输出"Hello,World"/***************************************第一个例子:输出"Hello,World"***************************************/set serverout on --设置SQL*Plus将服务器所返回的写出来begin --块开始DBMS_OUTPUT.put_line('Hello,World');--在控制台输出信息,类似C语言的Printf或者java语言中的System.out.printend; --块结束运行结果为:1. 接收数据并输出/***************************************在此基础上,完成Hello,某某,某某从客户端得到***************************************/declarev_name varchar2(20);begin --块开始v_name:='&姓名'; --与“客户端”交互,类似C语言的scanf语句DBMS_OUTPUT.put_line('Hello,'||v_name);end; --块结束运行结果为:7.2.简单变量的使用1.变量的声明与引用set serveroutput on;-- PL/SQL变量之简单类型declarev_dept_id number(5) := 1111;v_age binary_integer := 12;v_dept_name varchar2(20) := '人事部';v_rate constant number(4,2) := 22.12;v_valid boolean not null := TRUE;v_hire_date date not null := sysdate + 7;beginv_dept_id := 2222;dbms_output.put_line(v_dept_id);end;运行结果为:2.Into子句的使用:DeclareV_deptno number (2);v_loc varchar2(15);beginselect deptno,locinto v_deptno,v_locfrom deptwhere dname='SALES';DBMS_OUTPUT.PUT_LINE (V_deptno ||' and '||v_loc);end;运行结果为:实验练习:编写一PL/SQL程序,实现依次从客户端接收各字段的值,并放于变量中,输完一条记录的所有字段值后,将值写到数据库表Emp中。
请给出程序源码:DeclareV_EMPNO NUMBER(4);V_ENAME V ARCHAR2(10);V_JOB V ARCHAR2(9);V_MGR NUMBER(4);V_HIREDATE DATE;V_SAL NUMBER(7,2);V_COMM NUMBER(7,2);V_DEPTNO NUMBER(2);begininsert into empvalues('&V_EMPNO','&V_ENAME','&V_JOB','&V_MGR','&V_HIREDATE', '&V_SAL','&V_COMM','&V_DEPTNO');end;给出测试结果:3.变量作用域:阅读以下程序,熟悉变量的斌值方法,理解变量的作用,给出运行结果。
--嵌套块中的变量赋值和作用域DECLAREv_weight NUMBER(3) := 100;v_message VARCHAR2(255) := 'Outer Value';BEGINDECLAREv_weight NUMBER(3) := 1;v_message VARCHAR2(255) :='Inner value';BEGINv_weight := v_weight + 1;v_message := 'Put'|| v_message;DBMS_OUTPUT.PUT_LINE('inner block ' || to_char(v_weight) ||v_message);END;v_weight := v_weight + 1;v_message := 'Put' || v_message;DBMS_OUTPUT.PUT_LINE('outter block ' || to_char(v_weight) || v_message);END;运行结果为:7.3.使用%type和%rowtype变量1.使用%type变量阅读以下程序,理解其功能,给出运行结果。
(1)DROP TABLE EMPL;create table EMPL(EMPLOYEE_ID NUMBER(5) not null,LAST_NAME VARCHAR2(20) not null,HIRE_DATE DATE,SALARY NUMBER(8,2),JOB_ID NUMBER(5),DEP ARTMENT_ID NUMBER(5));set serveroutput on;-- PL/SQL变量之%TYPE类型declarev_last_name st_name%TYPE;---- 用户hrv_hire_date employees.hire_date%TYPE;v_balance number(6,2) ;v_min_balance v_balance%type;begindbms_output.put_line('定义%type类型的变量');end;/运行结果为:(2)declarev_deptno dept.deptno%type;v_loc dept.loc%type;beginselect deptno,locinto v_deptno,v_locfrom deptwhere dname='SALES';DBMS_OUTPUT.PUT_LINE (V_deptno ||' and '||v_loc);end;/运行结果为:2.使用%Rowtype变量阅读以下程序,理解其功能,给出运行结果。
(1)DROP TABLE EMPL;create table EMPL(EMPLOYEE_ID NUMBER(5) not null,LAST_NAME VARCHAR2(20) not null,HIRE_DATE DATE,SALARY NUMBER(8,2),JOB_ID NUMBER(5),DEP ARTMENT_ID NUMBER(5));set serveroutput on;-- PL/SQL变量之%ROWTYPE类型declarev_empl emp%rowtype;begindbms_output.put_line('定义%rowtype类型的变量');end;/运行结果为:(2)drop table stock;create table stock(symbol varchar2(50),price number(6,2));insert into stock values('IBM',188.88);insert into stock values('ORCL',100.88);DECLAREstock_info1 stock%ROWTYPE;stock_info2 stock%ROWTYPE;stock_info3 stock%ROWTYPE;BEGIN--对应纪录直接取得相应字段的:Populate the specific fields in a recordSELECT symbol,priceINTO stock_info1.symbol,stock_info1.priceFROM stockWHERE symbol ='ORCL';--对应纪录直接放入纪录中SELECT * INTO stock_info2 FROM stockWHERE symbol ='ORCL';stock_info3 := stock_info2;--记录间可以相互赋值stock_info3.symbol:='ORACLE';--对纪录的各字段赋值。