Oracle:PostgreSQL 中是否有相当于 ROW 的工具?

发布于 2024-10-03 20:24:21 字数 748 浏览 2 评论 0原文

当我在 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)));

When I instantiate a type in PostgreSQL, I can just make,

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

and the ROW(...) will be typecast to the correspondent type in the table. In Oracle I have to make it this way:

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

and manually put the type in the INSERT.

Is there any way to make Oracle behave like Postgres?

EDIT: Table definition

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)));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玩心态 2024-10-10 20:24:21

Oracle 中 PostgreSQL 的 ROW 构造函数的等效项是 对象或集合构造函数,如您在发布的代码中所示。

然而,没有单一表达式可以创建所需类型的实例。来自 Oracle 11g R2 数据库文档 ,显然必须显式调用构造函数来创建和引用类型:

初始化嵌套表或
vararray,你使用一个构造函数,一个
系统定义的函数具有相同的
名称作为集合类型。这
函数构造集合
传递给它的元素。

您必须显式调用构造函数
对于每个变量和嵌套表
多变的。关联数组,
第三种收藏,不要使用
构造函数。构造函数调用是
无论函数调用在哪里都允许
允许。

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

当考虑使用 CREATE TYPE 语句创建的架构级别类型时,行为也没有差异 - 在这种情况下也需要调用构造函数。来自文档

系统定义的属性值
构造函数要求您传递
构造函数为每个属性分配一个值
的类型。然后构造函数设置
新对象的属性
这些值的实例

The equivalent of the ROW constructor of PostgreSQL in Oracle is the object or collection constructor, as you've denoted in the posted code.

There is no singular expression however that would create an instance of the desired type. From the Oracle 11g R2 database documentation, it is evident that the constructor must be explicitly called to create and reference a type:

To initialize a nested table or
varray, you use a constructor, a
system-defined function with the same
name as the collection type. This
function constructs collections from
the elements passed to it.

You must explicitly call a constructor
for each varray and nested table
variable. Associative arrays, the
third kind of collection, do not use
constructors. Constructor calls are
allowed wherever function calls are
allowed.

Additionally, note that a default constructor is available for all types (except associative arrays), so you don't really need to write your own constructors.

There is also no difference in behavior when considering schema level types that are created using a CREATE TYPE statement - the constructor needs to be invoked in this case as well. From the documentation:

The system-defined attribute value
constructor requires you to pass the
constructor a value for each attribute
of the type. The constructor then sets
the attributes of the new object
instance to those values

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文