oracle自定义的记录类型,oracle记录类型 集合类型

本文详细介绍了Oracle数据库中的记录类型(RECORD)和集合类型,包括索引表、嵌套表和变长数组(VARY)。通过示例展示了如何创建、声明、填充和操作这些数据类型,并对比了它们的特点和使用场景。此外,还提到了集合类型的一些常用方法,如EXTEND、TRIM和DELETE等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-------------20140114------------

Oracle记录类型介绍

RECORD:用户自定义数据类型,由单行多列的标量构成的复合数据类型,它将一个或多个标量封装成一个对象进行操作

记录不可以总体拿来比较也不可以整体判断为空,可以整体拿来赋值

declare

--记录的创建

type type_1 is record (v_1 varchar2(100));

type t_record is record(

firstcode varchar2(100),

firstname varchar2(100),

secondcode varchar2(100),

secondname varchar2(100)

);

--记录类型变量的声明

v_record t_record;

cursor c1 is select FIRSTCODE,FIRSTNAME,SECONDCODE,SECONDNAME

from (

select 'AAA' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_01'

SECONDCODE,'主诉' SECONDNAME from dual

union all

select 'BBB' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_02'

SECONDCODE,'入院情况' SECONDNAME from dual

union all

select 'CCC' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_03'

SECONDCODE,'入院诊断' SECONDNAME from dual

union all

select 'DDD' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_04'

SECONDCODE,'诊疗经过' SECONDNAME from dual

);

v_count number:=0;

begin

open c1;

loop

v_count:=v_count+1;

--记录类型变量值得填充

fetch c1 into v_record;

--记录成员的访问

dbms_output.put_line('FIRSTCODE是:'||v_record.firstcode||',SECONDCODE是:'||v_record.SECONDCODE);

if v_count>3 then

v_record.firstcode:='EEE';

v_record.SECONDCODE:='EM000_07_05';

end if;

--使用记录更新数据

--update test set row=v_record;

--使用记录插入数据

--insert into test

values(v_record.firstcode,v_record.firstname,v_record.secondcode,v_record.secondname);

exit when v_count=5;

end loop;

end;

/

FIRSTCODE是:AAA,SECONDCODE是:EM000_07_01

FIRSTCODE是:BBB,SECONDCODE是:EM000_07_02

FIRSTCODE是:CCC,SECONDCODE是:EM000_07_03

FIRSTCODE是:DDD,SECONDCODE是:EM000_07_04

FIRSTCODE是:EEE,SECONDCODE是:EM000_07_05

PL/SQL procedure successfully completed

上面的例子包含了记录的创建,记录类型变量的声明,记录类型变量值得填充,记录成员的访问

理解记录可以与%rowtype比较,两者用法一致,可以将%rowtype理解为记录的简化升级

针对单列多行的数据就需要是用另一种变量类型:集合

oracle的集合包括:关联数组 即:索引表(plsql table)、嵌套表(nested

table)、变长数组(varry)

三种集合类型的区别:索引表只能在plsql块级别中使用,其余二者可以在数据库中直接使用(schema级别),也可以在plsql中使用

索引表:下表无限制,可为负数;元素个数无限制;

--使用binary_integer作为索引类型

declare

type type_table is table of varchar2(30) index by

binary_integer;

v_table type_table;

begin

v_table(10):='EM000_07_04';

v_table(-10):='EM000_07_01';

dbms_output.put_line('元素个数为:'||v_table.count);

v_table(-1):='EM000_07_02';

dbms_output.put_line('第一个元素为:'||v_table.first);

dbms_output.put_line('最后一个元素为:'||v_table.last);

dbms_output.put_line('元素个数为:'||v_table.count);

end;

/

元素个数为:2

第一个元素为:-10

最后一个元素为:10

元素个数为:3

PL/SQL procedure successfully completed

--使用varchar2作为索引类型

declare

type t_record is record(

firstcode varchar2(100),

firstname varchar2(100),

secondcode varchar2(100),

secondname varchar2(100)

);

v_record t_record;

type type_table is table of varchar2(100) index by

varchar2(100);

v_table type_table;

begin

select FIRSTCODE,FIRSTNAME,SECONDCODE,SECONDNAME into v_record

from (

select 'AAA' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_01'

SECONDCODE,'主诉' SECONDNAME from dual

union all

select 'BBB' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_02'

SECONDCODE,'入院情况' SECONDNAME from dual

union all

select 'CCC' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_03'

SECONDCODE,'入院诊断' SECONDNAME from dual

union all

select 'DDD' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_04'

SECONDCODE,'诊疗经过' SECONDNAME from dual

) where firstcode='AAA';

v_table(v_record.firstcode):=v_record.SECONDCODE;

select FIRSTCODE,FIRSTNAME,SECONDCODE,SECONDNAME into v_record

from (

select 'AAA' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_01'

SECONDCODE,'主诉' SECONDNAME from dual

union all

select 'BBB' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_02'

SECONDCODE,'入院情况' SECONDNAME from dual

union all

select 'CCC' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_03'

SECONDCODE,'入院诊断' SECONDNAME from dual

union all

select 'DDD' FIRSTCODE,'交班记录' FIRSTNAME,'EM000_07_04'

SECONDCODE,'诊疗经过' SECONDNAME from dual

) where firstcode='BBB';

v_table(v_record.firstcode):=v_record.secondcode;

dbms_output.put_line('元素个数为:'||v_table.count);

dbms_output.put_line('元素为:'||v_table(v_record.firstcode));

end;

/

元素个数为:2

元素为:EM000_07_02

PL/SQL procedure successfully completed

嵌套表:nested table

下表从1开始;元素个数无限制,使用时需初始化;可以使用extend属性扩展元素个数;

创建了嵌套表定义类型后可以作为表定义数据类型,嵌套表索引固定式int型,这也是与索引表的区别之一(index

by)

declare

type nest_type_table is table of varchar2(100) ;

v_table nest_type_table:=nest_type_table();

begin

v_table.extend;

v_table(1):='EM000_07_04';

v_table.extend;

v_table(2):='EM000_07_01';

dbms_output.put_line('元素个数为:'||v_table.count);

v_table.extend;

v_table(3):='EM000_07_02';

dbms_output.put_line('第一个元素为:'||v_table.first);

dbms_output.put_line('最后一个元素为:'||v_table.last);

dbms_output.put_line('元素个数为:'||v_table.count);

end;

/

元素个数为:2

第一个元素为:1

最后一个元素为:3

元素个数为:3

PL/SQL procedure successfully completed

嵌套表在数据表中使用,嵌套表类型列单独

首先创建类型:create or replace type nest_table_type is table of

varchar2(30);

然后创建表:

-- Create table

create table TEST_NEST_TABLE

(

ID  INTEGER,

DEPART_NO NEST_TABLE_TYPE

)

--创建该类型表必须指定存储嵌套表列数据表

nested table DEPART_NO store as NEST_TABLE

tablespace USERS

pctfree 10

initrans 1

maxtrans 255

storage

(

initial 64

next 1

minextents 1

maxextents

unlimited

);

-- Create/Recreate indexes

create unique index SYS_C0011360 on TEST_NEST_TABLE

(DEPART_NO)

tablespace USERS

pctfree 10

initrans 2

maxtrans 255

storage

(

initial 64K

next 1M

minextents 1

maxextents

unlimited

);

插入数据:

insert into test_nest_table

values(1,nest_table_type('aaa','bbb','ccc','ddd'));

查询数据:

varry可变数组,下标从1开始,定义时先指定最大元素个数;使用时也必须初始化

declare

type test_varray is varray(10) of int ;

v_varray test_varray:=test_varray();

begin

for i in 1..10 loop

v_varray.extend;

v_varray(i):=i*(i+1);

dbms_output.put_line('输出结果为:'||v_varray(i));

end loop;

end;

/

输出结果为:2

输出结果为:6

输出结果为:12

输出结果为:20

输出结果为:30

输出结果为:42

输出结果为:56

输出结果为:72

输出结果为:90

输出结果为:110

PL/SQL procedure successfully completed

集合类型选择:通常优先选择索引表类型,它不需要extend、初始化等操作。但美中不足的是该类型只能适用于plsql

block级别

集合的方法汇总:

EXISTS方法,检查元素是否存在

v_table.exists(n)=true/false

COUNT方法,获取集合的元素个数  v_table.count

LIMIT方法,获取集合的最大元素个数,对于内嵌表和关联数组,因为没有声明大小,所以LIMIT返回NULL值

v_varray.limit

FIRST和LAST方法,获取集合的首下标和尾下标

v_table.first/v_table.last

PRIOR和NEXT方法,获取前一个元素或后一个元素的下标

v_table.next(n)/v_table.next(n)

EXTEND方法,增加集合的元素,有3种形式

EXTEND: 追加一个NULL元素

EXTEND(n): 追加n个NULL元素

EXTEND(n, i): 追加n个第i个元素

TRIM方法,减少集合的元素个数,有2种形式

TRIM:在集合尾部删除一个元素

TRIM(n):在集合尾部删除n个元素

DELETE方法,删除集合的元素

不带参数的DELETE会删除所有元素,并设置COUNT为0

DELETE(n)会删除内嵌表或以数值为主键的关联数组的第n个元素

DELETE(m,n)会删除内嵌表或关联数组的所有范围在m..n之间的元素,如果m>n,那么DELETE(m,n)不起作用

declare

type type_table is table of varchar2(30) index by

binary_integer;

v_table type_table;

begin

v_table(10):='EM000_07_04';

v_table(-10):='EM000_07_01';

dbms_output.put_line('元素个数为:'||v_table.count);

dbms_output.put_line('aa:'||v_table.next(1));

v_table(-1):='EM000_07_02';

if v_table.exists(1)=true then

--判断第一个元素是否存在

--v_table.delete(2);  删除第二个元素

dbms_output.put_line('第一个元素为:'||v_table.first);

dbms_output.put_line('最后一个元素为:'||v_table.last);

dbms_output.put_line('元素个数为:'||v_table.count);

end if;

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值