Oracle12C--可变数组(三十三)

  • 定义简单类型的可变数组
    • 可变数组是一个对象的集合,其中每个对象都具有相同的数据类型;
      • 可变数组的大小在创建时决定;
      • 在表中建立可变数组后,可变数组在主表即为一个列;
      • 可变数组允许用户在表中存储重复的属性;
    • 创建可变数组类型语法:

create [or replace] type 类型名称 as|is varray(长度) of 数据类型 [not null];
/

  • 示例1:定义部门表,使用可变数组
    • 创建项目数组:

create or replace type project_varray as varray(3) of varchar2(50);
/

此句创建了一个数组型的数组,数组的长度为3,即每个部门的项目只能有3

DROP TABLE department PURGE ;

CREATE TABLE department (

did NUMBER ,

deptname VARCHAR2(30) NOT NULL ,

projects project_varray ,

CONSTRAINT pk_did PRIMARY KEY (did)

) ;

分析:
此时
department表中使用的project列就是一个数组形式的类型,可以同时保存多条记录

  • 向department表中增加数据

INSERT INTO department(did,deptname,projects) VALUES (10,'Oracle',

project_varray('ERP','CRM','CMS')) ;

INSERT INTO department(did,deptname,projects) VALUES (20,'MLDN出版部',

project_varray('Java开发实战经典》','Anbdroid开发实战经典》')) ;

COMMIT ;

定义的数组(project_varray)只能包含3个元素,所以增加数据时,项目名称最多增加了3

  • 查看department表数

SELECT * FROM department ;

效果:

  • 要想查询一个部门的所有项目,依然需要使用TABLE嵌套子查询的操作来完成

SELECT * FROM TABLE (

SELECT projects FROM department WHERE did=20) ;

  • 修改可变数组的内容时,需要将全部数据进行修改。删除时,也要将所有数据一起删除;
    • 修改一个部门的项目

UPDATE department SET

projects=project_varray('Oracle开发实战经典》','Java开发实战经典》','Android开发实战经典》')

WHERE did=20 ;

COMMIT ;

  • 查询更新后的部门信息

SELECT * FROM TABLE (

SELECT projects FROM department WHERE did=20) ;

  • 定义复合类型的可变数组
    • 此示例知识有待补充
  • PL/SQL中使用可变数组
    • 可变数组定义后,也可以作为PL/SQL使用的数据类型直接在程序中使用
    • 示例1:在PL/SQL中使用可变数组

DECLARE

TYPE project_varray IS VARRAY(3) OF VARCHAR2(50) ;

v_projects project_varray := project_varray(NULL,NULL,NULL) ;

BEGIN

v_projects(1) := 'JAVA SE' ;

v_projects(2) := 'JAVA EE' ;

v_projects(3) := 'Android' ;

FOR x IN v_projects.FIRST .. v_projects.LAST LOOP

DBMS_OUTPUT.put_line(v_projects(x)) ;

END LOOP ;

END ;

/

运行结果:

JAVA SE

JAVA EE

Android
分析:
定义的数组长度为
3,如果存放的数据过多,会提示越界错误

  • 示例2定义复合结构的可变数组

 

CREATE OR REPLACE TYPE project_type AS OBJECT(

projectid NUMBER ,

projectname VARCHAR(50),

projectfunds NUMBER ,

pubdate DATE

) ;

/

DECLARE

TYPE project_varray IS VARRAY(3) OF project_type NOT NULL ;

v_projects project_varray := project_varray(

project_type(10,'Java开发实战经典》',79.8,TO_DATE('2008-08-13','yyyy-mm-dd')) ,

project_type(11,'Java Web开发实战经典》',69.8,TO_DATE('2010-08-27','yyyy-mm-dd')) ,

project_type(12,'Android开发实战经典》',88,TO_DATE('2012-03-19','yyyy-mm-dd'))) ;

BEGIN

FOR x IN v_projects.FIRST .. v_projects.LAST LOOP

DBMS_OUTPUT.put_line('项目编号:' || v_projects(x).projectid || ',项目名称:' || v_projects(x).projectname

|| ',金额:' || v_projects(x).projectfunds || ',发布日期:' || v_projects(x).pubdate) ;

END LOOP ;

END ;

/

运行结果:

项目编号:10,项目名称:《Java开发实战经典》,金额:79.8,发布日期:13-8月 -08

项目编号:11,项目名称:《Java Web开发实战经典》,金额:69.8,发布日期:27-8月 -10

项目编号:12,项目名称:《Android开发实战经典》,金额:88,发布日期:19-3月 -12

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值