1、ORACLE,第七讲 记录类型与PL/SQL表,本章目标,熟练掌握不同情况下的记录类型与行级变量的使用熟练PL/SQL表的功能及其使用掌握批量绑定特性来简化代码,记录类型,什么是记录类型 类似于C语言中的结构体,用于处理PL/SQL程序块中单行多列数据。为什么要用记录类型 我们曾经学过的%ROWTYPE就是一个记录类型。如果我们需要表中的某些字段而不是全部字段作为一个变量类型,此时就要自己定义一个记录类型。在哪里用记录类型怎样用记录类型,记录类型,声明-如JAVA中先创建类 TYPE record_type IS RECORD( my_column_name1 datatype, my_col
2、umn_name2 datatype);创建实例(记录类型)-再定义类的对象 record_name record_type;其中:record_name为记录类型的实例record_type为我们自定义的记录类型我们不能操纵类型,只能操纵实例。,记录类型,举例: DECLARE TYPE emp_rec IS RECORD(eno emp.empno%TYPE, ena emp.ename%TYPE); e_row emp_rec; CURSOR emp_cur IS SELECT empno,ename FROM emp;BEGIN OPEN emp_cur; FETCH emp_cur
3、INTO e_row; WHILE emp_cur%FOUND LOOP dbms_output.put_line(e_row.eno| |e_row.ena); FETCH emp_cur INTO e_row; END LOOP; CLOSE emp_cur;END;,PL/SQL表,什么是PL/SQL表 在PL/SQL块中临时使用,如数组一样的对象,不能用它定义表中的字段。PLSQL表可以存储N个数据,所有数据的类型相同。键值对应,用来处理单行多列的数据。PL/SQL表特点:只包含一列或一个主键(一列不代表一个字段)列可以是任何标量数据类型不能对列或主键进行命名,PL/SQL表,主键必须
4、是BINARY_INTEGER(二进制整型)类型-9.2之前PL/SQL表大小无限制为什么用PL/SQL表在哪里用PL/SQL表怎样用PL/SQL表声明 TYPE table_type IS TABLE OF datatype INDEX BY BINARY_INTEGER|VARCHAR2();,PL/SQL表,创建实例 table_name table_type;举例1: DECLARE TYPE stu_type IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; stu stu_type;BEGIN stu(1):=Tom; stu(-2
5、):=Mary; dbms_output.put_line(stu(1); dbms_output.put_line(stu(-2);END;,PL/SQL表,由上例可见:PL/SQL表索引下标的整数可不连续PL/SQL表索引下标的整数可为负但不能出现未定义的索引下标,比如说stu(5)举例2: DECLARE TYPE student_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER; stu student_type;,PL/SQL表,BEGIN FOR i IN 1.10 LOOP stu(i):=STUDENT|i; END L
6、OOP; FOR i IN 1.10 LOOP dbms_output.put_line(stu(i); END LOOP;END;举例3: DECLARE,PL/SQL表,TYPE student_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER; stu student_type; j INT;BEGIN j:=,PL/SQL表,运行上例:ORA-01403: 未找到数据ORA-06512: 在line 12由于PL/SQL表中的某条数据被删除了,所以在我们 请求打印的时候会找不到数据正确的写法应该为: FOR i IN 1.10
7、LOOP IF i!=j THEN dbms_output.put_line(stu(i); END IF; END LOOP;,PL/SQL表,举例4: DECLARE TYPE student_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER; stu student_type; j INT;BEGIN j:=,PL/SQL表,stu.DELETE(j); FOR i IN 1.10 LOOP IF i!=j THEN dbms_output.put_line(stu(i); END IF; END LOOP; stu(11):=S
8、TUDENT11; dbms_output.put_line(stu(11); stu(10):=SSS; dbms_output.put_line(stu(10);END;,PL/SQL表,上例说明了PL/SQL表的插入和修改:插入:直接赋值。修改:覆盖原来的值。举例5: DECLARE TYPE emp_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER; e_row emp_type; CURSOR e_cur IS SELECT ename FROM emp; temp emp.ename%TYPE; c INT:=1; to
9、tal INT:=0;,PL/SQL表,BEGIN OPEN e_cur; FETCH e_cur INTO temp; WHILE e_cur%FOUND LOOP e_row(c):=temp; c:=c+1; FETCH e_cur INTO temp; END LOOP; total:=e_row.COUNT; FOR i IN 1.total LOOP dbms_output.put_line(e_row(i); END LOOP;END;,PL/SQL表,由上例可见:PL/SQL表的索引可以定义为任意整数,如不定义,则下标默认由1开始。COUNT()函数返回PL/SQL表中的元素个
10、数。当PL/SQL表存储多列时,把datatype改成记录类型或行级变量即可。FIRST函数返回第一个索引的值。LAST函数返回最后一个索引的值。举例6: DECLARE,PL/SQL表,TYPE area IS TABLE OF NUMBER INDEX BY VARCHAR2(20); areal area;BEGIN areal(北京):=1; areal(上海):=2; areal(广州):=3; dbms_output.put_line(第一个元素的索引是:|areal.FIRST); dbms_output.put_line(最后一个元素的索引是:|areal.LAST);,PL/
11、SQL表,dbms_output.put_line(第一个元素的值是:|areal(areal.FIRST); dbms_output.put_line最后一个元素的值是:|areal(areal.LAST);END; 由上例可见:PL/SQL表的索引除了可以定义为整数,还可定义为字符串。元素的下表索引按照拼音排序。,批量绑定,批量绑定: 将从基表中查询到的多行记录一次性赋给PL/SQL表类型的变量。SELECT 字段列表 BULK COLLECT INTO PL/SQL表实例 FROM tablename举例: DECLARE TYPE emp_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER; emp_row emp_type;,批量绑定,BEGIN SELECT * BULK COLLECT INTO emp_row FROM emp; FOR i IN 1.emp_row.COUNT LOOP dbms_output.put_line(emp_row(i).empno| |emp_row(i).ename| |emp_row(i).job); END LOOP;END;,