一: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 .
自定义类型一般分为两种,object类型和table类型.
object类似于一个recored,可以表示一个表的一行数据,object的字段就相当与表的字段.
table类型表示一个数组,需要用的已经定义好的object类型
三:type record用法概述
type 自定义Object类型B is record(
字段1 类型1,
字段2 类型2
);
3.1:什么是记录(Record)?
由单行多列的标量构成的复合结构。可以看做是一种用户自定义数据类型。组成类似于多维数组。
将一个或多个标量封装成一个对象进行操作。是一种临时复合对象类型。
3.2:%ROWTYPE和记录(Record)?
请区别%ROWTYPE和记录(Record)类型。%ROWTYPE可以说是Record的升级简化版。
区别在与前者结构为表结构,后者为自定义结构。二者在使用上没有很大区别。前者方便,后者灵活。在实际中根据情况来具体决定使用。
Record + PL/SQL表可以进行数据的多行多列存储。
3.3:如何创建和使用记录?
①创建记录类型 语法:
TYPE 记录名
IS
RECORD
(
filed1 type1 [
NOT
NULL
] [:=eXPr1],
....... ,
记录可以整体赋值
记录不可以整体比较,只可以比较记录字段
记录不可以整体判断为空,只可以判断记录字段
使用%TYPE和%ROWTYPE动态指定记录字段。
使用记录向表中插入数据? 根据表结构合理安排记录字段。比如主外键。 如果用记录(RECORD)插入数据,那么只能使用记录成员; 如果用%ROWTYPE插入数据,可以直接使用%ROWTYPE。
例子:使用记录成员向表中插入数据
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向表中插入数据
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”时:
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”,代码如下写就可以达到上面的效果
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、类型嵌套
–创建基于前一个类型的新的抽象数据类型:巨星类型
CREATE
OR
REPLACE
TYPE SuperStarType
AS
OBJECT
(
StarName varchar2(30),
Address AddressType
);
3、基于抽象类型创建关系表
CREATE
TABLE
SuperStar
(
StarID
varchar
(10),
Star SuperStarType
);
4、基于抽象类型创建对象表
CREATE
TABLE
SuperStarObj
of
SuperStarType;
5、使用构造方法在表中插入记录
INSERT INTO SuperStar VALUES(
''
001
''
,SuperStarType(
''
Zidane
''
,AddressType(
''
France
''
,
''
Paris
''
,
''
People
Street NO.
1
''
)));
6、查询表中记录
(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)创建可变数组的基类型
CREATE
OR
REPLACE
TYPE MingXiType
AS
OBJECT
(
GoodID varchar2(20),
InCount
int
,
ProviderID
varchar
(20)
);
(2)创建嵌套项类型的可变数组
CREATE
OR
REPLACE
TYPE arrMingXiType
AS
VARRAY(100)
OF
MingXiType;
(3)创建一个主表
CREATE
TABLE
InStockOrder
(
OrderID
varchar
(15)
Not
Null
Primary
Key
,
InDate
date
,
OperatorID
varchar
(15),
MingXi arrMingXiType
);
2、操作可变数组
(1)插入数据
INSERT
INTO
InStockOrder
VALUES
(
''
200710110001
''
,TO_DATE(
''
2007-10-11
''
,
''
YYYY-MM-DD
''
),
''
007
''
,
arrMingXiType(MingXiType(
''
G001
''
,100,
''
1001
''
),
MingXiType(
''
G002
''
,888,
''
1002
''
))
);
(2)查询数据
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()函数
SQL>
SELECT
*
FROM
Table
(
SELECT
t.MingXi
FROM
InStockOrder t
WHERE
t.OrderID=
''
200710110001
''
);
GOODID INCOUNT PROVIDERID
-------------------- ---------- --------------------
G001 100 1001
G002 888 1002
(4)修改数据
UPDATE
InStockOrder
SET
MingXi=arrMingXiType(MingXiType(
''
G001
''
,200,
''
1001
''
),
MingXiType(
''
G002
''
,8888,
''
1002
''
))
WHERE
OrderID=
''
200710110001
''