Oracle实验5PLSQL复合数据类型记录表和可变数组资料Word格式.docx
《Oracle实验5PLSQL复合数据类型记录表和可变数组资料Word格式.docx》由会员分享,可在线阅读,更多相关《Oracle实验5PLSQL复合数据类型记录表和可变数组资料Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
![Oracle实验5PLSQL复合数据类型记录表和可变数组资料Word格式.docx](https://file1.bdocx.com/fileroot1/2022-10/8/90115163-6ff2-4929-a79b-d993717c14e6/90115163-6ff2-4929-a79b-d993717c14e61.gif)
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
SETSERVEROUTPUTON
typedept_typeistableOFdept%rowtype
indexbybinary_integer;
v_countnumber;
dept_listdept_type;
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);
3、*阅读以下程序,找出出错之处,说明出错原因,预测运行输出结果是什么。
请删改错误,加上适当注释后,运行该程序,验证自己的预测是否正确。
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('
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'
num_5(4):
DELL'
FORCOUNTERIN1..4LOOP
DBMS_OUTPUT.PUT_LINE(NUM_5(COUNTER));
END;
/*修改:
在此处给dis_dept初始化,否则无法使用*/
4、将上题改为使用INDEXBYBINARY_INTEGER的索引表,则实现同一执行结果,程序要做哪些相应的改变。
以下是与上题对应的另一个相关的例子:
TYPEdept_listISTABLEOFdept.dname%TYPEindexbybinary_integer;
--定义索引组织表
--索引表的声明
v_countnumber(3);
--为表元素赋值
IFnotdis_dept.exists
(2)THEN
dis_dept
(2):
--dis_dept.extend
(2);
--索引表无须使用extend(n)增加元素,使用了反而出错
dis_dept(3):
EXTEND_ELEMENT'
v_count:
=dis_dept.count;
dis_dept表增添元素后的个数为:
FORiIN1..v_countloop
DBMS_OUTPUT.PUT_LINE(dis_dept(i));
5、使用%ROWTYPE属性,基于游标student_cur定义记录。
显示'
CS'
系学生的序号、姓名和年龄等信息。
(参见教材P255例11.3)
序号学生姓名年龄
1李明勇20
2张立19
declare
CURSORstudent_cur
IS
SELECTsno,sname,sageFROMstudent
WHEREsdept='
stu_recordstudent_cur%rowtype;
DBMS_OUTPUT.PUT_LINE('
序号姓名年龄'
FORstu_recordINstudent_curLOOP
DBMS_OUTPUT.PUT_LINE(stu_record.sno||'
'
||stu_record.sname||'
||stu_record.sage);
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('
王晓芳'
张纯玉'
刘春苹'
));
VALUES(10104,'
孔世杰'
王天仪'
韩刘'
}
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
学生姓名:
||sname_table1(i));
INTOsname_table2