背景
当在处理数据过程中需要返回多个类型的数据时,自定义一个包含多种类型数据的类型就极为方便(参考结构)
oracle
定义记录数据类型。它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的、分离的、基本数据类型的变量组成一个整体的方法,即RECORD
复合数据类型。在使用记录数据类型变量时,需要在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。
自定义类型有两种创建方式:type和create type
相同点:可用关键字create type或者直接用type定义自定义类型
区别:create后面用as,type后面用is;create创建的是object,type创建的是record;type用在语句块中,create是独立的
注意:type是局部类型,create type是全局类型
create type 变量 as table of 类型
create type 变量 as object(字段1 类型,字段2 类型)
示例
CREATE OR REPLACE TYPE "STRU" as object(
v_slno number(12,0), --站点序号
v_reportdate date, --进站时间
v_length number, --最长序列的长度
v_dateOrder DateOrder--该序列对应的时间序列
);
type 变量 is table of 类型
type 变量 is record(字段1 类型, 字段2 类型)
type rec_cjr is record
(
cjrid varchar2(30)
);
注意:type ··· is table of 类似一个二维数组(index by binary_integer自增长下标)
PostgreSQL
postgresql 的type定义需要在数据库中定义,而不是函数中定义,可理解为postgresql中的type只可以定义全局类型 。CREATE TYPE 为当前数据库注册一个新的数据类型。定义该类型的用户成为其所有者
示例
create TYPE STRU as(
v_slno int, --站点序号
v_reportdate timestamp, --进站时间
v_length int, --最长序列的长度
v_dateOrder timestamp array[500]--该序列对应的时间序列
(注意: 类型Struts中的v_dateOrder不能直接修改,必须创建一个同类型的临时变量作为标量,修改标量后赋值 )
);
注意:postgreql中不可以直接用type定义,需用create type;即postgresql不能在函数体内定义内型,需在函数体外定义类型;由于PostgreSQL的type是全局的,这个也需要注意,如果多个PL/SQL函数用到了同样的type name但是结构不一样,移植到到plpgsql时,需要创建多个type,在plpgsql中分别使用对应的类型名(即类型名不能相同,且类型名不能和表名相同)。
应用状况
orcale
type rec_cjr is record
(
cjrid varchar2(30) ,
tk integer
);
type cjr is table of rec_cjr index by binary_integer;
postgresql
create type rec_cjr is record
(
cjrid varchar2(30) ,
tk integer
);
cjr rec_cjr array;
小结:
1. postgresql使用array替代了PL/SQL的table定义。
2. 复合类型的数组,不能直接修改复合类型的element,需要先用标量修改好后赋值。
3.PL/SQL的type是局部变量,而PostgreSQL的type是全局的,这个也需要注意,如果多个PL/SQL函数用到了同样的类型但是结构不一样,迁移到plpgsql时,需要创建多个类型,在plpgsql中分别使用对应的类型名(即类型名不能相同)。如果给出模式名,那么该类型是在指定模式中创建。否则它将在当前模式中创建。类型名必需和同一模式中任何现有的类型或者域不同。因为表和数据类型有联系,所以类型名也不能和同模式中的表名字冲突。
网友评论