http://www.itpub.net/viewthread.php?tid=610297&extra=page%3D1%26amp%3Bfilter%3Ddigest&page=1

浅谈oracle复合数据类型

--本文档可以直接拷贝运行。

/*

oracle复合数据类型

PL/SQL有两种复合数据结构:记录和集合。记录由不同的域组成,集合由不同的元素组成。

*/

/*

一、记录类型

类似C语言中的结构,有两种定义方式:显式定义和隐式定义。

*/

create table test

(

id varchar2(20),

mc varchar2(60)

);

insert into test values('111','11111');

insert into test values('222','22222');

insert into test values('333','33333');

insert into test values('444','44444');

insert into test values('555','55555');

insert into test values('666','66666');

commit;

/*

1.1、显示定义记录

*/

set serverout on

declare

type t_record is record

(

id test.id%type,

mc test.mc%type

);

var_record t_record;

counter number default 0;

begin

for row_test in (select id,mc from test) loop

counter := counter + 1;

var_record.id := row_test.id;

var_record.mc := row_test.mc;

dbms_output.put_line('var_record:'||var_record.id||'---'||var_record.mc);

dbms_output.put_line('row_test:'||row_test.id||'---'||row_test.mc);

dbms_output.put_line('================loop '||counter||' times.');

end loop;

exception when others then

dbms_output.put_line(sqlcode||sqlerrm);

end;

/

/*有一些PL/SQL指令在使用隐式定义记录时没有使用%ROWTYPE属性,比如游标FOR循环或触发器中的ld和:new记录。*/

/*

1.2、隐式定义记录

*/

隐式定义记录中,我们不用描述记录的每一个域,在声明记录变量时使用%ROWTYPE命令定义与数据库表,视图,游标有相同结构的记录。

declare

t_record1 test%rowtype;

cursor cur_test(v_id in varchar2) is

select id,mc from test

where id <= v_id;

t_record2 cur_test%rowtype;

begin

for row_test in cur_test('333') loop

t_record1.id := row_test.id;

t_record1.mc := row_test.mc;

t_record2.id := row_test.id;

t_record2.mc := row_test.id;

dbms_output.put_line('t_record1:'||t_record1.id||'---'||t_record1.mc);

dbms_output.put_line('t_record2:'||t_record2.id||'---'||t_record2.mc);

dbms_output.put_line('row_test:'||row_test.id||'---'||row_test.mc);

dbms_output.put_line('================loop '||cur_test%rowcount||' times.');

end loop;

exception when others then

dbms_output.put_line(sqlcode||sqlerrm);

end;

/

/*

二、集合

类似C语言中的数组,在ORACLE7.3及以前的版本中只有一种集合称为PL/SQL表,这种类型的集合依然保留,就是索引(INDEX_BY)表。

PL/SQL有三种类型的集合a、Index_by表

b、嵌套表

c、VARRAY

三种类型的集合之间的差异,包括数据绑定、稀疏性(sparsity)、数据库中的存储能力都有不相同。

数据绑定:

绑定涉及到集合中元素数量的限制,VARRAY集合中的元素的数量是有限,Index_by和嵌套表则是没有限制的。

稀疏性(sparsity):

稀疏性描述了集合的下标是否有间隔,Index_by表和嵌套表可以是稀疏的,VARRAY类型的集合则是紧密的,它的下标之间没有间隔。

存储:

Index_by表不能存储在数据库中,但嵌套表和VARRAY可以被存储在数据库中。

Index_by表定义语法如下:

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY BINARY_INTEGER;

关键字是INDEX BY BINARY_INTEGER,没有这个关键字,那么集合将是一个嵌套表。由于不存储在数据库中,

element_type可以是任何合法的PL/SQL数据类型,包括:PLS/INTEGER、SIGNTYPE、和BOOLEAN。

嵌套表定义语法如下:

嵌套表非常类似于Index_by表,创建的语法也非常相似。只是没有INDEX BY BINARY_INTEGER子串

TYPE type_name IS TABLE OF element_type [NOT NULL];

存储在一个数据库中的嵌套表并不与表中的其它数据存放在同一个数据块中,它们实际上被存放在第二个表中。

从数据库中取回的嵌套表也不保证元素的顺序。集合数据是离线存储的,所以嵌套表适合大型集合。

VARRAY定义语法如下:

TYPE type_name IS [VARRAY|VARYING ARRAY] (max_size) OF element_type [NOT NULL];

max_size是一个整数,用于标示VARRAY集合拥有的最多元素数目。VARRAY集合的元素数量可以低于max_size,但不能超过max_size。

element_type是一维元素的数据类型,如果element_type是记录,那么这个记录只能使用标量数据字段(与嵌套标相似)。

VARRAY存储在数据库中时与表中的其他数据存放在同一个数据块中,元素的顺序保存在VARRAY中。

集合是在线存储的,VARRAY很适合于小型集合。

嵌套表和VARRAY都能作为列存储在数据库表中,所以集合自身可以为NULL,当集合为NULL时,用户也不能引用集合中的元素。

用户可以使用IS NULL操作符检测集合是否为NULL。

1、index_by表:

*/

declare

cursor cur_test is select id,mc from test;

type t_test1 is table of varchar2(60) index by binary_integer;

type t_test2 is table of test%rowtype index by binary_integer;

var_test1 t_test1;

var_test2 t_test2;

var_new t_test2;

begin

SELECT id,mc INTO var_test2(0) FROM test WHERE id='111';

dbms_output.put_line('var_test2(0):'||var_test2(0).id||'---'||var_test2(0).mc);

SELECT id,mc INTO var_test2(8) FROM test WHERE id='333';

dbms_output.put_line('var_test2(8):'||var_test2(8).id||'---'||var_test2(8).mc);

var_new := var_test2;

dbms_output.put_line('=====  copy var_test2 to var_new  =====');

dbms_output.put_line('var_new(0):'||var_new(0).id||'---'||var_new(0).mc);

dbms_output.put_line('var_new(8):'||var_new(8).id||'---'||var_new(8).mc);

end;

/

/*

嵌套表和VARRAY由构造函数初始化

2、嵌套表和VARRAY:

*/

DECLARE

TYPE t_test1 IS TABLE OF test.id%TYPE;

TYPE t_test2 IS VARRAY (10) OF test.id%TYPE;

var_test1 t_test1;

var_test2 t_test2;

begin

--var_test1(1) := ('test1.1'); --没有初始化不能赋值

var_test1 := t_test1('test1.1','test1.2','test1.3');

dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));

var_test2 := t_test2('test2.1','test2.2','test2.3');

dbms_output.put_line('var_test2: '||var_test2(1)||','||var_test2(2)||','||var_test2(3));

var_test1(2) := 'test1.2_update';

dbms_output.put_line('====  修改了var_test1(2)  ====');

dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));

dbms_output.put_line(var_test1.next(3));

dbms_output.put_line('var_test2元素个数: '||var_test2.limit());

end;

/

/*

嵌套表的元素可以是集合,注意赋值的时候是varray_element.record_column := 的形式.

除了构造函数外,集合还有很多内建函数,按照面向对象编成的叫法称之为方法。

方法==========描述====================================================================使用限制

COUNT=========返回集合中元素的个数

DELETE========删除集合中所有元素

DELETE(x)=====删除元素下标为x的元素===================================================对VARRAY非法

DELETE(x,y)===删除元素下标从X到Y的元素================================================对VARRAY非法

EXIST(x)======如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE

EXTEND========在集合末尾添加一个元素==================================================对Index_by非法

EXTEND(x)=====在集合末尾添加x个元素===================================================对Index_by非法

EXTEND(x,n)===在集合末尾添加元素n的x个副本============================================对Index_by非法

FIRST=========返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。

LAST==========返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.

LIMIT=========返回VARRY集合的最大的元素个数===========================================Index_by集合和嵌套表无用

NEXT(x)=======返回在第x个元素之后及紧挨着它的元素的值,如果x是最后一个元素,返回null.

PRIOR(x)======返回在第x个元素之前紧挨着它的元素的值,如果x是第一个元素,则返回null。

TRIM==========从集合末端开始删除一个元素==============================================对于index_by不合法

TRIM(x)=======从集合末端开始删除x个元素===============================================对index_by不合法

*/

/*

三、综合实例BULK COLLECT的用法

*/

set serverout on

DECLARE

TYPE t_record IS RECORD (

id number(18,0),

mc varchar2(50)

);

var_record t_record;

type t_test is table of t_record;

var_test t_test := t_test();

cursor cur_test is select id,mc from test;

begin

open cur_test;

fetch cur_test BULK COLLECT INTO var_test;

for i in 1..var_test.count() loop

dbms_output.put_line(var_test(i).id||'---'||var_test(i).mc);

end loop;

end;

/

--------------------------------------

一个oracle函数返回数组的例子

----------------------------------------

今天给一个朋友写了个函数返回数组的例子,顺便贴出来。

create or replace type t_ret_table is table of varchar2(20);

create or replace function f_test(var_num in integer) return t_ret_table is

var_out t_ret_table;

begin

var_out := t_ret_table();

var_out.extend(var_num);

for i in 1..var_num loop

var_out(i) := i;

end loop;

return var_out;

end f_test;

/

set serverout on

declare

aa t_ret_table;

begin

aa := f_test(10);

for i in 1..aa.count loop

dbms_output.put_line(aa(i));

end loop;

end;

/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/293106/viewspace-580548/,如需转载,请注明出处,否则将追究法律责任。

oracle组合数据类型,oracle复合数据类型-ZT相关推荐

  1. JAVA的简单数据类型和复合数据类型

    Java的简单数据类型 数据类型 数据类型就是对内存位置的抽象表达.程序员可以利用多种数据类型:某些由编程语言定义,某些由外部库定义,还有些则由程序员来定义.很多编程语言都依赖于特定的计算机类型和对数 ...

  2. php四种标量,php的标量数据类型和复合数据类型,php四种标量

    php的标量数据类型和复合数据类型PHP的标量数据类型和复合数据类型, 标量数据类型 数值类型 整型$ a=20 浮点型(小数)$ a=1.2 布尔类型 $ a=trueecho $ a//输出1 $ ...

  3. 7-基本数据类型和复合数据类型(引用数据类型)

    目录 1.基本数据类型 1.1.逻辑型--boolean 1.2.文字型--char和String 1.2.1.char 1.2.2.String 1.3.整数类型:byte,short,int和lo ...

  4. java复合数据类型_复合数据类型

    1.列表,元组,字典,集合分别如何增删改查及遍历. 答: (1)列表的增删改查: 增:使用append()方法在列表的末尾增加新的元素 删:使用del语句来删除列表的元素 改:通过下标索引找到值然后直 ...

  5. oracle map order,oracle面向对象技术中的map和order方法有何不同?

    MAP方法MAP方法用于将对象实例映射为标量数值(NUMBER,DATE,VARCHAR2等):对于相同对象类型不同对象实例来说,因为他们的数据类型是复合数据类型,所以对象实例之间不能直接进行比较.为 ...

  6. oracle组合数据类型,oracle复合数据类型-相关方法

    oracle提供了一些内置的函数和方法来操作复合数据类型. 一.count 返回集合中的元素的个数 declare type ename_table_type is table of varchar2 ...

  7. 【oracle】复合数据类型

    [oracle]复合数据类型 1123-02 更新 复合数据类型 复合数据类型举例 1.record set serveroutput on; /* 复合数据类型--记录:for循环中 给 记录类型变 ...

  8. 浅谈oracle复合数据类型

    原文位于:http://www.itpub.net/viewthread.php?tid=610297&extra=page%3D2%26amp%3Bfilter%3Ddigest --本文档 ...

  9. oracle复合数据类型

    嵌套表定义: TYPE type_naem AS TABLE OF element_type[NOT NULL] 嵌套表内建函数: 1.使用了构造函数进行初始化(可以带元素) 2.EXTEND==== ...

最新文章

  1. 处理数字_1_计算某列的最小/大值
  2. java socket通信demo_Java Socket通信示例
  3. python知识点总结全_【转】Python高级知识点总结
  4. C# 关于密码加密 (转载)
  5. Linux调度系统全景指南(中篇)
  6. CSS之深入理解 flex 布局以及计算
  7. javascript运动学教程
  8. MSPA安装与生态源地提取
  9. crawlspider
  10. flash动画转html5 效果,一键把SWF转HTML5 canvas动画的工具-Fanvas
  11. 自动安装L2tp的脚本
  12. HLK 微软驱动签名过程中踩过的坑
  13. pytorch einsum, numpy einsum
  14. 忆阻器交叉开关阵列中的长短期记忆(LSTM)神经网络
  15. 数据库+jdbc实现学生教师管理
  16. tensor 张量保存为txt文件
  17. visio电路图怎么连线_还在用visio画电路图?不看后悔!
  18. 365天挑战LeetCode1000题——Day 124 单调队列模板
  19. docker磁盘空间不足解决办法
  20. 杭电OJ——ACM 1009.FatMouse‘ Trade

热门文章

  1. unknown target connected的解决方法
  2. 峰值预测性能指标PPTS(Peak percentage of threshold statistic)
  3. 超模脸、网红脸、萌娃脸...换头像不重样?我开源了5款人脸生成器
  4. Hibernate中的一对多关系映射
  5. Navicat for MySQL 11注册码
  6. PWA——下一代的web应用模型
  7. 《荒漠甘泉》4月19日
  8. 第二章 z变换之四 、序列的z变换与连续时间信号的Laplace变换、Fourier变换的关系
  9. iOS UIKit框架注解
  10. HCIA-第八节0615