当我在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)));
答案 0 :(得分:1)
Oracle中PostgreSQL的ROW构造函数的等价物是object or collection constructor,正如您在发布的代码中所表示的那样。
然而,没有单一的表达式会创建所需类型的实例。从Oracle 11g R2 database documentation开始,很明显必须显式调用构造函数来创建和引用类型:
初始化嵌套表或 varray,你使用一个构造函数,一个 系统定义的功能与之相同 name作为集合类型。这个 函数构造集合 传递给它的元素。
您必须显式调用构造函数 对于每个varray和嵌套表 变量。关联数组, 第三种收藏,不要使用 构造函数。构造函数调用是 允许函数调用的地方 允许的。
另外,请注意,默认构造函数可用于所有类型(关联数组除外),因此您不需要编写自己的构造函数。
在考虑使用CREATE TYPE
语句创建的模式级别类型时,行为也没有区别 - 在这种情况下也需要调用构造函数。来自documentation:
系统定义的属性值 构造函数要求你传递 构造函数每个属性的值 这种类型。然后构造函数设置 新对象的属性 实例到那些值