Oracle实验5PLSQL复合数据类型记录表和可变数组资料.docx
《Oracle实验5PLSQL复合数据类型记录表和可变数组资料.docx》由会员分享,可在线阅读,更多相关《Oracle实验5PLSQL复合数据类型记录表和可变数组资料.docx(14页珍藏版)》请在冰豆网上搜索。
Oracle实验5PLSQL复合数据类型记录表和可变数组资料
《数据库开发技术》实验5报告
实验题目:
PL/SQL复合数据类型:
记录、表和可变数组
日期
2015–11-28
班级
计算机1301
姓名
实验环境:
Win10+Oracle11g
一、实验内容与完成情况(记录所有的实验过程):
1、根据表emp的全部字段定义记录变量emp_record。
用SELECT语句将编号为7788的雇员的全部字段对应地存入该记录变量,最后输出记录变量的雇员名称字段emp_record.ename和雇员工资字段的内容。
执行结果如下:
SCOTT的工资为:
3000
PL/SQL过程已成功完成。
PL/SQL过程已成功完成。
SQL语句
setSERVEROUTPUTON
DECLARE
TYPEemp_recordisRECORD
(empnoEMP.EMPNO%TYPE,
enameEMP.ENAME%TYPE,
JobEMP.JOB%TYPE,
mgrEMP.MGR%TYPE,
hiredateEMP.HIREDATE%TYPE,
salEMP.SAL%TYPE,
commnumber(10,2):
=0,
deptnonumber(3):
=10
);
e_recordemp_record;
begin
select*intoe_record
fromempwhereempno=7788;
dbms_output.put_line(e_record.ename||'的工资为:
'||to_char(e_record.sal));
end;/
实验结果截图
2、声明一张Index_By(关联数组)表,用来接收并存储DEPT表的信息,把部门号作为键,不要忘记部门号是10的倍数。
使用循环从DEPT表中将所有部门信息检索到PL/SQL记录表中,然后用另一个循环来显示表中的这些信息。
执行结果为:
10,ACCOUNTING,NEWYORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
PL/SQL过程已成功完成。
SQL语句
SETSERVEROUTPUTON
DECLARE
typedept_typeistableOFdept%rowtype
indexbybinary_integer;
v_countnumber;
dept_listdept_type;
begin
selectCOUNT(*)intov_countFROMdept;
foriIN1..v_countLOOP
select*intodept_list(i*10)
fromdeptwheredeptno=i*10;
ENDLOOP;
FORiIN1..v_countLOOP
DBMS_OUTPUT.PUT_LINE(dept_list(i*10).deptno||','||dept_list(i*10).dname||','||dept_list(i*10).loc);
ENDLOOP;
end;/
实验结果截图
3、*阅读以下程序,找出出错之处,说明出错原因,预测运行输出结果是什么。
请删改错误,加上适当注释后,运行该程序,验证自己的预测是否正确。
SETSERVEROUTPUTON
DECLARE
TYPEdept_listISTABLEOFdept.dname%TYPE;--定义嵌套表
TYPEtop5_listISVARRAY(5)OFdept.loc%TYPE;--定义可变数组
dis_deptdept_list;--嵌套表的声明
num_5top5_list;--可变数组的声明
BEGIN
dis_dept
(1):
='AMGN';
IFdis_deptISNULLTHEN
dis_dept:
=dept_list('AMGN','BGEN');
DBMS_OUTPUT.PUT_LINE('dis_dept表当前元素个数为:
'||to_char(dis_dept.count));
ENDIF;
num_5:
=top5_list('ORCL','CSCO',NULL,NULL);
IFnum_5(3)ISNULLTHEN
num_5(3):
='CPQ';
ENDIF;
num_5(4):
='DELL';
FORCOUNTERIN1..4LOOP
DBMS_OUTPUT.PUT_LINE(NUM_5(COUNTER));
ENDLOOP;
END;
/
执行结果为:
SQL语句
SETSERVEROUTPUTON
DECLARE
TYPEdept_listISTABLEOFdept.dname%TYPE;--定义嵌套表
TYPEtop5_listISVARRAY(5)OFdept.loc%TYPE;--定义可变数组
dis_deptdept_list;--嵌套表的声明
num_5top5_list;--可变数组的声明
BEGIN
/*修改:
在此处给dis_dept初始化,否则无法使用*/
IFdis_deptISNULLTHEN
dis_dept:
=dept_list('AMGN','BGEN');
DBMS_OUTPUT.PUT_LINE('dis_dept表当前元素个数为:
'||to_char(dis_dept.count));
ENDIF;
num_5:
=top5_list('ORCL','CSCO',NULL,NULL);
IFnum_5(3)ISNULLTHEN
num_5(3):
='CPQ';
ENDIF;
num_5(4):
='DELL';
FORCOUNTERIN1..4LOOP
DBMS_OUTPUT.PUT_LINE(NUM_5(COUNTER));
ENDLOOP;
END;
实验结果截图
4、将上题改为使用INDEXBYBINARY_INTEGER的索引表,则实现同一执行结果,程序要做哪些相应的改变。
以下是与上题对应的另一个相关的例子:
SETSERVEROUTPUTON
DECLARE
TYPEdept_listISTABLEOFdept.dname%TYPEindexbybinary_integer;--定义索引组织表
TYPEtop5_listISVARRAY(5)OFdept.loc%TYPE;--定义可变数组
dis_deptdept_list;--索引表的声明
num_5top5_list;--可变数组的声明
v_countnumber(3);
BEGIN
dis_dept
(1):
='AMGN';--为表元素赋值
IFnotdis_dept.exists
(2)THEN
dis_dept
(2):
='BGEN';
DBMS_OUTPUT.PUT_LINE('dis_dept表当前元素个数为:
'||to_char(dis_dept.count));
--dis_dept.extend
(2);--索引表无须使用extend(n)增加元素,使用了反而出错
dis_dept(3):
='EXTEND_ELEMENT';
v_count:
=dis_dept.count;
DBMS_OUTPUT.PUT_LINE('dis_dept表增添元素后的个数为:
'||to_char(dis_dept.count));
FORiIN1..v_countloop
DBMS_OUTPUT.PUT_LINE(dis_dept(i));
ENDLOOP;
ENDIF;
num_5:
=top5_list('ORCL','CSCO',NULL,NULL);
IFnum_5(3)ISNULLTHEN
num_5(3):
='CPQ';
ENDIF;
num_5(4):
='DELL';
FORCOUNTERIN1..4LOOP
DBMS_OUTPUT.PUT_LINE(NUM_5(COUNTER));
ENDLOOP;
END;
实验结果截图
5、使用%ROWTYPE属性,基于游标student_cur定义记录。
显示'CS'系学生的序号、姓名和年龄等信息。
(参见教材P255例11.3)
执行结果为:
序号学生姓名年龄
1李明勇20
2张立19
SQL语句
SETSERVEROUTPUTON
declare
CURSORstudent_cur
IS
SELECTsno,sname,sageFROMstudent
WHEREsdept='CS';
stu_recordstudent_cur%rowtype;
begin
DBMS_OUTPUT.PUT_LINE('序号姓名年龄');
FORstu_recordINstudent_curLOOP
DBMS_OUTPUT.PUT_LINE(stu_record.sno||''||stu_record.sname||''||stu_record.sage);
ENDLOOP;
end;
实验结果截图
6.阅读以下程序,并写出程序执行结果。
{
CREATETYPEsname_typeISTABLEOFVARCHAR2(10);
CREATETABLEMentors(
mentor_idNUMBER(5)
CONSTRAINTmentor_pkPRIMARYKEY,
mentor_nameVARCHAR2(10)NOTNULL,
student_namesname_type
)NESTEDTABLEstudent_nameSTOREASsname_table;
INSERTINTOmentors
VALUES(10101,'王彤',sname_type('王晓芳','张纯玉','刘春苹','王晓芳'));
INSERTINTOmentors
VALUES(10104,'孔世杰',sname_type('王天仪','韩刘','刘春苹'));
}
SETSERVEROUTON
DECLARE
sname_table1sname_type;
sname_table2sname_type;
sname_tablesname_type;
BEGIN
SELECTstudent_name
INTOsname_table1
FROMmentors
WHEREmentor_name='王彤';
DBMS_OUTPUT.PUT_LINE('集合sname_table1中的元素--');
FORiIN1..sname_table1.COUNTLOOP
DBMS_OUTPUT.PUT_LINE('学生姓名:
'||sname_table1(i));
ENDLOOP;
SELECTstudent_name
INTOsname_table2
FROMmentors