ORACLE 自定义类型 type/ object

ORACLE 自定义类型 type/ object

2017年03月28日 13:58:23

阅读数:3173

一:Oracle中的类型有很多种,主要可以分为以下几类:

 

1、字符串类型。如:char、nchar、varchar2、nvarchar2。

2、数值类型。如:int、number(p,s)、integer、smallint。

3、日期类型。如:date、interval、timestamp。

4、PL/SQL类型。如:pls_integer、binary_integer、binary_double(10g)、binary_float(10g)、boolean。plsql类型是不能在sql环境中使用的,比如建表时。

5、自定义类型:type / create type。

二:type / create type 区别联系

 

相同:

可用用关键字create type 或者直接用type定义自定义类型,

区别:

1、create type 变量 as table of 类型

2、create type 变量 as object(

    字段1 类型1,

    字段2 类型2

    );

 

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

3、type 变量 is table of 类型

4、type 变量 is record(

    字段1 类型1,

    字段2 类型2

    );

用 create 后面用 as , 若直接用 type 后面用 is

create 是创 object , 而 type 是创 record .

 

区别是 用 create 后面用 as , 若直接用 type 后面用 is

create 是创 object , 而 type 是创 record .

 

一般定义object的语法:

 

create type 自定义表类型A as table of 自定义Object类型A

create type 自定义Object类型A as object(

字段1 类型1,

字段2 类型2

);

 

type 自定义表类型B is table of 类型

type 自定义Object类型B is record(

字段1 类型1,

字段2 类型2

);

 

 

自定义类型一般分为两中,object类型和table类型.object类似于一个recored,可以表示一个表的一行数据,

 

object的字段就相当与表的字段.

 

自定义的table类型需要用的已经定义好的object类型.

 

 

三:type record用法概述

type 自定义Object类型B is record(

字段1 类型1,

字段2 类型2

);

3.1:什么是记录(Record)?
由单行多列的标量构成的复合结构。可以看做是一种用户自定义数据类型。组成类似于多维数组。
将一个或多个标量封装成一个对象进行操作。是一种临时复合对象类型。

记录可以直接赋值。RECORD1 :=RECORD2;
记录不可以整体比较.
记录不可以整体判断为空。

3.2:%ROWTYPE和记录(Record)?
请区别%ROWTYPE和记录(Record)类型。%ROWTYPE可以说是Record的升级简化版。
区别在与前者结构为表结构,后者为自定义结构。二者在使用上没有很大区别。前者方便,后者灵活。在实际中根据情况来具体决定使用。
Record + PL/SQL表可以进行数据的多行多列存储。

3.3:如何创建和使用记录?
  ①创建记录类型   语法:

1

2

3

4

5

6

TYPE  记录名  IS RECORD

 (

  filed1 type1 [NOT NULL] [:=eXPr1],

      ....... ,

   filedN typen [NOT NULL] [:=exprn]


记录可以整体赋值 

记录不可以整体比较,只可以比较记录字段

记录不可以整体判断为空,只可以判断记录字段

使用%TYPE和%ROWTYPE动态指定记录字段。 

 

 

使用记录向表中插入数据? 根据表结构合理安排记录字段。比如主外键。 如果用记录(RECORD)插入数据,那么只能使用记录成员; 如果用%ROWTYPE插入数据,可以直接使用%ROWTYPE。
例子:使用记录成员向表中插入数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

DECLARE

Type MyRecType Is  Record

(

  RENO  EMPA.EMPNO%Type,

  RENAME   VARCHAR2(10),

  RJOB   EMPA.JOB%Type

);

EmpRec MyRecType;

Begin

Select   EMPNO, ENAME, JOB  InTo  EmpRec  From empa Where empa.EMPNO = '7369';

DBMS_OUTPUT.PUT_LINE(EmpRec.RENO||'  '||EmpRec.RENAME||'  '||EmpRec.RJOB);

EmpRec.RENO  := 1001;

EmpRec.RENAME := '杰克';

EmpRec.RJOB  := '办事员';

Insert InTo  empa(EMPNO,ENAME,JOB)  Values(EmpRec.RENO, EmpRec.RENAME,EmpRec.RJOB);

Select  EMPNO, ENAME, JOB  InTo  EmpRec  From empa Where empa.EMPNO = '1001';

DBMS_OUTPUT.PUT_LINE(EmpRec.RENO||'  '||EmpRec.RENAME||'  '||EmpRec.RJOB);

End;

 

 

3.5:使用记录更新数据? 如果用记录(RECORD)更新数据,那么只能使用记录成员; 如果用%ROWTYPE更新数据,可以直接使用%ROWTYPE。
例子:使用%ROWTYPE向表中插入数据

1

2

3

4

5

6

DECLARE

vEmp empa%RowType;

Begin

Select  InTo  vEmp  From empa Where empa.EMPNO = '7369';

UpDate empa Set ROW = vEmp Where EMPNO = 1001;

End;

 

 

四:type  table用法

4.1:定义

type 变量 is table of 类型

TYPE orders_type IS TABLE OF all_orders%ROWTYPE;

4.2:用法

 

1. TYPE tabletype IS TABLE  OF type INDEX BY BINARY_INTEGER;

定义:TYPE t_charTable IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER; 

引用:tableName(index); 

 

 

Oracle中index by binary_integer的作用

如语句:type  numbers  is table of number index by binary_integer;其作用是,加了”index by binary_integer ”后,numbers类型的下标就是自增长,numbers类型在插入元素时,不需要初始化,不需要每次extend增加一个空间。

  而如果没有这句话“index by binary_integer”,那就得要显示对初始化,且每插入一个元素到numbers类型的table中时,都需要先extend.

  示例:

  没加“index by binary_integer”时:

1

2

3

4

5

6

7

8

9

10

11

12

13

declare

type numbers is table of number;

n    numbers := numbers();

begin

n.extend;

n(1) := 2;

n.extend;

n(2) := 3;

for i in1 .. n.count loop

dbms_output.put_line(n(i));

end loop;

end;

--输出:2,3

  而如果加了“index by binary_integer”,代码如下写就可以达到上面的效果

 

1

2

3

4

5

6

7

8

9

10

declare

  type numbers is table of number index by binary_integer;

  n numbers;

  begin

  n(1) := 2;

  n(2) := 3;

  for i in1 .. n.count loop

  dbms_output.put_line(n(i));

  end loop;

  end;

 

 

五:create type 用法

5.1:定义

概念 

  方法:是在对象类型说明中用关键字  MEMBER   声明的子程序   

  方法是作为对象类型定义组成部分的一个过程或函数   

  方法不能与对象类型或其任何属性同名   

  与数据包程序相似,大多数方法有两个部分 

 

 

一、抽象数据类型

1、创建类型

--地址类型

CREATE OR REPLACE TYPE AddressType AS OBJECT

(

Country varchar2(15),

City varchar2(20),

Street varchar2(30)

);

 

2、类型嵌套

--创建基于前一个类型的新的抽象数据类型:巨星类型

1

2

3

4

5

CREATE OR REPLACE TYPE SuperStarType AS OBJECT

(

StarName varchar2(30),

Address AddressType

);

 

3、基于抽象类型创建关系表

1

2

3

4

5

CREATE TABLE SuperStar

(

StarID varchar(10),

Star SuperStarType

);

 

4、基于抽象类型创建对象表

1

CREATE TABLE SuperStarObj of SuperStarType;

 

5、使用构造方法在表中插入记录

1

INSERT INTO SuperStar VALUES(''001'',SuperStarType(''Zidane'',AddressType(''France'',''Paris'',''People Street NO.1'')));

 

6、查询表中记录

1

2

3

4

5

6

7

8

9

10

11

12

(1)SQL> SELECT * FROM SuperStar;

STARID

----------

STAR(STARNAME, ADDRESS(COUNTRY, CITY, STREET))

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

001

SUPERSTARTYPE(''Zidane'', ADDRESSTYPE(''France'', ''Paris'', ''People Street NO.1''))

(2)

SELECT s.StarID,s.Star.StarName,s.Star.Address.Country,s.Star.Address.City,s.Star.Address.Street FROM SuperStar s

STARID STAR.STARNAME STAR.ADDRESS.CO STAR.ADDRESS.CITY STAR.ADDRESS.STREET

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

001 Zidane France Paris People Street NO.1

 

二、可变数组

1、创建带有可变数组的表

(1)创建可变数组的基类型

1

2

3

4

5

6

CREATE OR REPLACE TYPE MingXiType AS OBJECT

(

GoodID varchar2(20),

InCount int,

ProviderID varchar(20)

);

(2)创建嵌套项类型的可变数组

1

CREATE OR REPLACE TYPE arrMingXiType AS VARRAY(100) OF MingXiType;

(3)创建一个主表

1

2

3

4

5

6

7

CREATE TABLE InStockOrder

(

OrderID varchar(15) Not Null Primary Key,

InDate date,

OperatorID varchar(15),

MingXi arrMingXiType

);

 

2、操作可变数组

(1)插入数据

1

2

3

4

5

INSERT INTO InStockOrder

VALUES(''200710110001'',TO_DATE(''2007-10-11'',''YYYY-MM-DD''),''007'',

arrMingXiType(MingXiType(''G001'',100,''1001''),

MingXiType(''G002'',888,''1002''))

);

(2)查询数据

1

2

3

4

5

6

7

SQL> SELECT * FROM InStockOrder;

ORDERID INDATE OPERATORID

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

MINGXI(GOODID, INCOUNT, PROVIDERID)

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

200710110001 11-OCT-07 007

ARRMINGXITYPE(MINGXITYPE(''G001'', 100, ''1001''), MINGXITYPE(''G002'', 888, ''1002'')

(3)使用Table()函数

1

2

3

4

5

6

SQL> SELECT * FROM Table(SELECT t.MingXi FROM InStockOrder t

WHERE t.OrderID=''200710110001'');

GOODID INCOUNT PROVIDERID

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

G001 100 1001

G002 888 1002

(4)修改数据

1

2

3

4

UPDATE InStockOrder

SET MingXi=arrMingXiType(MingXiType(''G001'',200,''1001''),

MingXiType(''G002'',8888,''1002''))

WHERE OrderID=''200710110001''

注意:不能更新VARRAY中的单个元素,必须更新整个VARRAY

以上是部分内容,持续更新Oracle相关

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值