大型数据库技术实验71Word格式文档下载.docx
《大型数据库技术实验71Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《大型数据库技术实验71Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
Begin
ForiIn1..maxrecordsLoop
InsertIntohqf.testtable(recordnumber,currentdate)--hqf为模式名,应改动
Values(i,Sysdate);
dbms_output.put_line('
现在输入的内容是:
'
||i||'
'
||Sysdate);
Commit;
--这里切记要commit否则将不会将数据提交到表中
EndLoop;
记录已经按照计划全部插入,请查看!
);
End;
//注:
hqf为登录用户名,需根据情况改动,如:
实验中一般用scott.
(3).查询表中数据,给出查询结果截图:
2.导入教材实验数据
(1).创建用户school,并赋于相应的权限:
CREATEUSERvendition
identifiedbyvendition;
GRANTCREATESESSION,RESOURCE,DBA
TOvendition;
CREATEUSERSCHOOL
identifiedbySCHOOL;
TOSCHOOL;
(2).将文件夹“TestTableBak”中的备份文件school.DMP和vendition.DMP复制到某一目录下(例如E盘根目)。
(3).然后启动CMD命令提示窗口,运行如下的还原命令。
impuserid=school/schoolignore=yfromuser=schooltouser=schoolfile=e:
\school.DMP
impuserid=vendition/venditionignore=yfromuser=venditiontouser=venditionfile=e:
\vendition.DMP
(4).验证确认。
以用户名School登录系统,查看相应的表,看是否有数据。
7.2.最简单的PL/SQL程序
1.输出"
Hello,World"
/***************************************
第一个例子:
输出"
***************************************/
setserverouton--设置SQL*Plus将服务器所返回的写出来
begin--块开始
DBMS_OUTPUT.put_line('
Hello,World'
--在控制台输出信息,类似C语言的Printf或者java语言中的System.out.print
end;
--块结束
运行结果为:
1.接收数据并输出
在此基础上,完成Hello,某某,某某从客户端得到
declare
v_namevarchar2(20);
v_name:
='
&
姓名'
;
--与“客户端”交互,类似C语言的scanf语句
Hello,'
||v_name);
7.3.简单变量的使用
1.变量的声明与引用
setserveroutputon;
--PL/SQL变量之简单类型
v_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;
begin
v_dept_id:
=2222;
dbms_output.put_line(v_dept_id);
/
2.Into子句的使用:
Declare
V_deptnonumber
(2);
v_locvarchar2(15);
begin
selectdeptno,loc
intov_deptno,v_loc
fromdept
wheredname='
SALES'
DBMS_OUTPUT.PUT_LINE(V_deptno||'
and'
||v_loc);
end;
实验练习:
编写一PL/SQL程序,实现依次从客户端接收各字段的值,并放于变量中,输完一条记录的所有字段值后,将值写到数据库表Emp中。
请给出程序源码:
v_EMPNONUMBER(4);
v_ENAMEVARCHAR2(10);
v_JOBVARCHAR2(9);
v_MGRNUMBER(4);
v_HIREDATEDATE;
v_SALNUMBER(7,2);
v_COMMNUMBER(7,2);
v_DEPTNONUMBER
(2);
begin
v_EMPNO:
EMPNO'
v_ENAME:
ENAME'
v_JOB:
JOB'
v_MGR:
MGR'
v_HIREDATE:
HIREDATE'
v_SAL:
SAL'
v_COMM:
COMM'
v_DEPTNO:
DEPTNO'
insertintoemp
values(v_EMPNO,v_ENAME,v_JOB,v_MGR,v_HIREDATE,v_SAL,v_COMM,v_DEPTNO);
给出测试结果:
3.变量作用域:
阅读以下程序,熟悉变量的斌值方法,理解变量的作用,给出运行结果。
--嵌套块中的变量赋值和作用域
DECLARE
v_weightNUMBER(3):
=100;
v_messageVARCHAR2(255):
OuterValue'
BEGIN
DECLARE
v_weightNUMBER(3):
=1;
v_messageVARCHAR2(255):
Innervalue'
BEGIN
v_weight:
=v_weight+1;
v_message:
Put'
||v_message;
DBMS_OUTPUT.PUT_LINE('
innerblock'
||to_char(v_weight)||v_message);
END;
||v_message;
outterblock'
END;
7.4.使用%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)
--PL/SQL变量之%TYPE类型
v_last_nameemployees.last_name%TYPE;
----用户hr
v_hire_dateemployees.hire_date%TYPE;
v_balancenumber(6,2);
v_min_balancev_balance%type;
定义%type类型的变量'
(2)declare
v_deptnodept.deptno%type;
v_locdept.loc%type;
begin
selectdeptno,loc
intov_deptno,v_loc
fromdept
wheredname='
DBMS_OUTPUT.PUT_LINE(V_deptno||'
/
2.使用%Rowtype变量
(1) DROPTABLEEMPL;
--PL/SQL变量之%ROWTYPE类型
v_emplemp%rowtype;
定义%rowtype类型的变量'
(2) droptablestock;
createtablestock
symbolvarchar2(50),
pricenumber(6,2)
insertintostockvalues('
IBM'
188.88);
ORCL'
100.88);
stock_info1stock%ROWTYPE;
stock_info2stock%ROWTYPE;
stock_info3stock%ROWTYPE;
--对应纪录直接取得相应字段的:
Populatethespecificfieldsinarecord
SELECTsymbol,price
INTOstock_info1.symbol,stock_info1.price
FROMstock
WHEREsymbol='
--对应纪录直接放入纪录中
SELECT*INTOstock_info2FROMstock
stock_info3:
=stock_info2;
--记录间可以相互赋值
stock_info3.symbol:
ORACLE'
--对纪录的各字段赋值。
stock_info1:
||stock_info1.symbol||'
||stock_info1.price);
stock_info2:
||stock_info2.symbol||'
||stock_info2.price);
stock_info3:
||stock_info3.symbol||'
||stock_info3.price);
思考:
如下所示:
改变表结构。
droptablestock;
symbolvarchar2(50),
pricenumber(6,2),
ownervarchar2(10)
对以上程序运行有影响吗?
为什么?
没有影响,因为程序中没有使用到增加的那个字段.
7.5.条件判断语句的使用
阅读并理解以下程序,调试并给出运行结果。
1.If语句:
droptableemployee;
createtableemployee(
empnonumber(4),
namevarchar2(30),
salarynumber(8,2)
insertintoemployeevalues(7900,'
黄蓉'
3000);
commit;
--执行结果如何呢?
--注意employee.salary%TYPE这一类型定义,定义v_SALARY为emp表的sal字段的类型
--这是plsql一种方便的定义类型方法。
v_salaryemployee.salary%type;
v_commentvarchar2(35);
/*返回employee的salary*/
SELECTsalary
INTOv_SALARY
FROMemployee
WHEREname='
--WHEREempno=7900;
薪水是:
||v_SALARY);
--条件判断语句
IFv_SALARY<
1000THEN
v_Comment:
比较低'
ELSIFv_SALARY<
3000THEN
Alittlehigher:
凑和'
5000THEN--ELSIF!
不是elseif
high:
比较高'
ELSE
VERYHIGH:
非常高!
ENDIF;
TheEmployee:
salaryis'
hissalaryis'
||v_Comment);
给出运行结果:
2.Case语句:
为了简化多个选择用if来做判断,这种case区别于编程语言中的case语句多用于多种情况的判断。
7.6.循环语句的使用
0.建立一个临时表
--建立一个临时表,用于测试
DROPTABLEtemp_table;
CREATETABLEtemp_table(
num_colNUMBER,
char_colVARCHAR2(60)
1.LOOP语句
--LOOP语句
v_CounterNUMBER:
LOOP
--以loopcounter向temp_tableInsert纪录
--.
INSERTINTOtemp_table
VALUES(v_Counter,'
Loopindex'
v_Counter:
=v_Counter+1;
--循环终止条件-whentheloopcounter>
50
--跳出循环.
IFv_Counter>
10THEN
EXIT;
ENDLOOP;
2.FORLOOP语句
--FORLOOP语句
FORv_CounterIN1..10LOOP
v_Counteris'
||v_Counter);
--DBMS_OUTPUT.PUT_LINE(v_Counter);
--在for循环外不可以访问循环变量
3.whileLOOP语句
--whileLOOP语句
--v_Counter<
=10--循环.
WHILEv_Counter<
=50LOOP
4.while语句
--WHILE语句
=10LOOP