Oracle:在PostgreSQL中是否有与ROW相同的东西?

时间:2010-11-24 15:45:06

标签: sql oracle postgresql types insert

当我在PostgreSQL中实例化一个类型时,我可以做,

INSERT INTO mountain VALUES ('Meru',4567,ROW(6.8,-3.2));

并且ROW(...)将被强制转换为表中的对应类型。在Oracle中,我必须这样做:

INSERT INTO mountain VALUES ('Meru',4567,GeoCoord(6.8,-3.2));

并手动将类型放入INSERT。

有没有办法让Oracle的行为像Postgres一样?

编辑:表格定义

CREATE TABLE Mountain (
 Name VARCHAR(20) CONSTRAINT MountainKey PRIMARY KEY,
 Height NUMERIC CONSTRAINT MountainHeight
 CHECK (Height >= 0),
 Coordinates GeoCoord CONSTRAINT MountainCoord
 CHECK (((Coordinates).Longitude >= -180) AND 
        ((Coordinates).Longitude <= 180) AND
        ((Coordinates).Latitude >= -90) AND
        ((Coordinates).Latitude <= 90)));

1 个答案:

答案 0 :(得分:1)

Oracle中PostgreSQL的ROW构造函数的等价物是object or collection constructor,正如您在发布的代码中所表示的那样。

然而,没有单一的表达式会创建所需类型的实例。从Oracle 11g R2 database documentation开始,很明显必须显式调用构造函数来创建和引用类型:

  

初始化嵌套表或   varray,你使用一个构造函数,一个   系统定义的功能与之相同   name作为集合类型。这个   函数构造集合   传递给它的元素。

     

您必须显式调用构造函数   对于每个varray和嵌套表   变量。关联数组,   第三种收藏,不要使用   构造函数。构造函数调用是   允许函数调用的地方   允许的。

另外,请注意,默认构造函数可用于所有类型(关联数组除外),因此您不需要编写自己的构造函数。

在考虑使用CREATE TYPE语句创建的模式级别类型时,行为也没有区别 - 在这种情况下也需要调用构造函数。来自documentation

  

系统定义的属性值   构造函数要求你传递   构造函数每个属性的值   这种类型。然后构造函数设置   新对象的属性   实例到那些值