Oracle扩展PL/SQL简介(三)
2009-09-29 21:10
337 查看
5. 复合数据类型
1) 记录类型:
● 自定义记录类型
记录有益于处理单行多列的数据,当使用PL/SQL记录时,即可以自定义记录类型和记录变量,也可以使用%rowtype属性直接定义记录变量
type emp_record_type is record(
v_name varchar2(32),
v_salary number(8,2);
);
emp_record emp_record_type;
● %type记录类型
同上,只是成员类型取表字段类型
declare
type emp_record_type is record(
v_name emp.ename%type,
v_address emp.sal%type
);
emp_record emp_record_type;
begin
select ename,sal into emp_record from emp where rownum=1;
dbms_output.put_line(emp_record. v_name ||' '|| emp_record. v_address);
end;
/
● %rowtype记录结构
表示表的一行
前缀为表名
内部域的属性为表中列的数据类型
域的名称为列的名称
如:emp_record emp%rowtype
举例:
declare
dept_record dept%rowtype;
begin
select * into dept_record from dept where rownum=1;
dbms_output.put_line(dept_record.deptno||' '|| dept_record.dname||' ' ||dept_record.loc);
end;
/
2) 集合类型:
集合类型包括Associative arrays(index by table),nested table,varray三种,集合是存放同类元素的一个容器。
● Associative arrays(index by table)
Associative arrays也被称为index by table(oracle9i之前),下标成员使用任意数值类型和字符类型(包括子类),如果下标成员是数值类型则可以是负值。初始化只要给一个元素赋值就行,和其他两种需要构造器初始化不一样。注意定义schema级别的类型不能是index by表类型。
TYPE type_name IS TABLE OF
{column_type | variable%type | table.column%type} [NOT NULL]
| table.%ROWTYPE [INDEX BY BINARY_INTEGER];
identifier type_name;
举例:
declare
type t1 is table of emp.ename%type index by binary_integer;
type t2 is table of date index by binary_integer;
v1 t1;
v2 t2;
begin
v1(1) :='ANDREW';
v2(8) :=sysdate;
select ename,hiredate into v1(7900),v2(7900) from emp where empno=7900;
dbms_output.put_line(v1(1)|| ' ----'||v1(7900));
dbms_output.put_line(v2(8)|| ' ----'||v2(7900));
end;
/
● 嵌套表nested table
嵌套表拥有一个任意数字类型的成员,作为下标顺序编号。可以定义等价的SQL类型,允许嵌套表存储在数据库表以及通过SQL进行操作。嵌套表没有index by关键字(这是和Associative arrays的区别),初始化必须用构造器,大小可以自动增长。元素无循序排列。
nested table可能没有连续的下标,而数组总是密集(有连续下标)。最初,nested table密集存放,但有可能成为稀疏存放(有非连续下标)。当使用内建的方法"DELETE"删除嵌套表元素后,即使序列有差距,使用"NEXT"方法仍迭代nested table所有下标。如下图:
举例:
DECLARE
TYPE roster IS TABLE OF VARCHAR2(15);
v_names roster := roster('D Caruso', 'J Hamil', 'D Piro', 'R Singh');
BEGIN
FOR i IN v_names.FIRST .. v_names.LAST LOOP
dbms_output.put_line(v_names(i));
END LOOP;
END;
/
● varrays (简称可变数组)
varrays (简称可变数组) 拥有固定的成员(虽然可以在运行时改变元素的个数)。使用顺序编号作为下标(如下图),元素之间是紧密排列的,需要通过构造器初始化。可以定义等价的SQL类型,允许将varrays存储在数据库表中。varray可以通过SQL语句存储和检索数据,但是不如nested tables灵活。
TYPE type_name IS VARRAY(size_limite) OF
{column_type | variable%type | table.column%type} [NOT NULL]
identifier type_name;
DECLARE
TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
ename_table ename_table_type := ename_table_type('mary');
BEGIN
SELECT ename INTO ename_table(1) FROM emp WHERE empno = '7900';
dbms_output.put_line('雇员名:' || ename_table(1));
END;
/
● 集合的内置方法
如果不需要参数,可以省略括号。其中x,y…为下标,下标列出此方法对哪个集合实用以及相应的操作用法。
1) 记录类型:
● 自定义记录类型
记录有益于处理单行多列的数据,当使用PL/SQL记录时,即可以自定义记录类型和记录变量,也可以使用%rowtype属性直接定义记录变量
type emp_record_type is record(
v_name varchar2(32),
v_salary number(8,2);
);
emp_record emp_record_type;
● %type记录类型
同上,只是成员类型取表字段类型
declare
type emp_record_type is record(
v_name emp.ename%type,
v_address emp.sal%type
);
emp_record emp_record_type;
begin
select ename,sal into emp_record from emp where rownum=1;
dbms_output.put_line(emp_record. v_name ||' '|| emp_record. v_address);
end;
/
● %rowtype记录结构
表示表的一行
前缀为表名
内部域的属性为表中列的数据类型
域的名称为列的名称
如:emp_record emp%rowtype
举例:
declare
dept_record dept%rowtype;
begin
select * into dept_record from dept where rownum=1;
dbms_output.put_line(dept_record.deptno||' '|| dept_record.dname||' ' ||dept_record.loc);
end;
/
2) 集合类型:
集合类型包括Associative arrays(index by table),nested table,varray三种,集合是存放同类元素的一个容器。
● Associative arrays(index by table)
Associative arrays也被称为index by table(oracle9i之前),下标成员使用任意数值类型和字符类型(包括子类),如果下标成员是数值类型则可以是负值。初始化只要给一个元素赋值就行,和其他两种需要构造器初始化不一样。注意定义schema级别的类型不能是index by表类型。
TYPE type_name IS TABLE OF
{column_type | variable%type | table.column%type} [NOT NULL]
| table.%ROWTYPE [INDEX BY BINARY_INTEGER];
identifier type_name;
举例:
declare
type t1 is table of emp.ename%type index by binary_integer;
type t2 is table of date index by binary_integer;
v1 t1;
v2 t2;
begin
v1(1) :='ANDREW';
v2(8) :=sysdate;
select ename,hiredate into v1(7900),v2(7900) from emp where empno=7900;
dbms_output.put_line(v1(1)|| ' ----'||v1(7900));
dbms_output.put_line(v2(8)|| ' ----'||v2(7900));
end;
/
● 嵌套表nested table
嵌套表拥有一个任意数字类型的成员,作为下标顺序编号。可以定义等价的SQL类型,允许嵌套表存储在数据库表以及通过SQL进行操作。嵌套表没有index by关键字(这是和Associative arrays的区别),初始化必须用构造器,大小可以自动增长。元素无循序排列。
nested table可能没有连续的下标,而数组总是密集(有连续下标)。最初,nested table密集存放,但有可能成为稀疏存放(有非连续下标)。当使用内建的方法"DELETE"删除嵌套表元素后,即使序列有差距,使用"NEXT"方法仍迭代nested table所有下标。如下图:
举例:
DECLARE
TYPE roster IS TABLE OF VARCHAR2(15);
v_names roster := roster('D Caruso', 'J Hamil', 'D Piro', 'R Singh');
BEGIN
FOR i IN v_names.FIRST .. v_names.LAST LOOP
dbms_output.put_line(v_names(i));
END LOOP;
END;
/
● varrays (简称可变数组)
varrays (简称可变数组) 拥有固定的成员(虽然可以在运行时改变元素的个数)。使用顺序编号作为下标(如下图),元素之间是紧密排列的,需要通过构造器初始化。可以定义等价的SQL类型,允许将varrays存储在数据库表中。varray可以通过SQL语句存储和检索数据,但是不如nested tables灵活。
TYPE type_name IS VARRAY(size_limite) OF
{column_type | variable%type | table.column%type} [NOT NULL]
identifier type_name;
DECLARE
TYPE ename_table_type IS VARRAY(20) OF emp.ename%TYPE;
ename_table ename_table_type := ename_table_type('mary');
BEGIN
SELECT ename INTO ename_table(1) FROM emp WHERE empno = '7900';
dbms_output.put_line('雇员名:' || ename_table(1));
END;
/
● 集合的内置方法
如果不需要参数,可以省略括号。其中x,y…为下标,下标列出此方法对哪个集合实用以及相应的操作用法。
方法 | 描述 | 使用限制 |
count方法 | 返回集合中元素的个数 | |
delete过程 | DELETE,删除集合中所有元素 DELETE(x),删除元素下标为x的元素,如果x 为null则集合保持不变 DELETE(x,y),删除元素下标从X到Y的元素删除一个或多个或所有元素,如果x>y 则集合保持不变。 | 对varray,只能做全部删除操作 |
exists函数 | exists(x),如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE | |
extend过程 | EXTEND,在集合末尾添加一个元素 EXTEND(x),在集合末尾添加x个元素 EXTEND(x,n),在集合末尾添加元素n的x个副本 | 对index by table无效 |
first和last | FIRST,返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1 LAST,返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT. | 对varray 而言,first 始终是1,last 始终等于count |
limit | 返回VARRAY集合的最大的元素个数 | nested table 为null,对index by 表不起作用。 |
prior,next | NEXT(x),返回在第x个元素之后及紧挨着它的元素的值,如果x是最后一个元素,返回null. PRIOR(x),返回在第x个元素之前紧挨着它的元素的值,如果x是第一个元素,则返回null。 | 若元素x 是第一个元素,则prior 返回null, 若是最后一个元素,next 返回null |
trim过程 | 从集合末尾删除一个元素或多个元素 TRIM,从集合末端开始删除一个元素 TRIM(x),从集合末端开始删除x个元素 | 对于index_by不合法 |
相关文章推荐
- Oracle扩展PL/SQL简介(一)
- Oracle扩展PL/SQL简介(二)
- Oracle扩展PL/SQL简介(四)
- Oracle扩展PL/SQL简介(六)
- Oracle扩展PL/SQL简介(五)
- Oracle扩展PL/SQL简介
- Oracle扩展PL/SQL编程简介
- Oracle扩展PL/SQL编程简介
- ORACLE PL/SQL编程之一:PL/SQL 程序设计简介
- ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介
- Oracle PL/SQL开发基础(第二十九弹:异常处理简介)
- Oracle Class6. PL/SQL 简介(数据类型,逻辑比较,控制结构,错误处理)
- oracle PL/SQL简介
- ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
- ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介
- Oracle教程之pl/sql简介
- Oracle Class6-1. PL/SQL 简介(数据类型,逻辑比较,控制结构,错误处理)
- Oracle PL/SQL简介
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
- Oracle Class6-2. PL/SQL 简介(数据类型,逻辑比较,控制结构,错误处理)