oracle pl sql扩展,Oracle扩展PL/SQL简介(三)

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所有下标。如下图:

0818b9ca8b590ca3270a3433284dd417.png

举例:

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灵活。

0818b9ca8b590ca3270a3433284dd417.png

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不合法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值