【问题标题】:Type reference scope类型参考范围
【发布时间】:2010-12-14 16:07:23
【问题描述】:

我正在研究数据库,目前正在从事一个对象关系数据库项目,我遇到了一个关于对象表中可能的约束数量的小问题。我正在使用 Hector Garcia-Molina(和其他作者)的“数据库系统:全书”作为参考,并且有一个像这样的通用 SQL 示例:

CREATE TYPE StarType AS (
  name CHAR(30),
  address AddressType,
  bestMovie REF(MovieType) SCOPE Movies
);

现在,我的项目中有一种类似的类型,因为它还使用对类型中的另一种类型的引用,但是在其中放置引用的子句不包括 Oracle 中的 SCOPE(至少我没有t 在文档中找到它并输出错误)。所以我有这样的类型:

CREATE OR REPLACE TYPE "ApplicationType" AS OBJECT (
  "person" REF "PersonType",
  "competition" REF "CompetitionType",
  "dateApplied" DATE
);
/

...这行得通。但是当我想约束 REF 列时,我只能约束一个,如下所示:

CREATE TABLE "Applications" OF "ApplicationType" (
  "person" SCOPE IS "People" /* or "competition" SCOPE IS "Competitions" */
)
OBJECT IDENTIFIER IS SYSTEM GENERATED;

有没有办法对两个 REF 列进行约束?

【问题讨论】:

  • 两者都尝试会发生什么?您收到什么错误消息?
  • 我收到“ORA-00904: : invalid identifier”错误。但是当我单独使用其中任何一个约束时,表格会正常创建。

标签: oracle scope types constraints ref


【解决方案1】:

这很好用:

CREATE TABLE Applications OF ApplicationType (
  person SCOPE IS People,
  competition SCOPE IS Competitions
)
OBJECT IDENTIFIER IS SYSTEM GENERATED;

也许您尝试使用 or 而不是 , 创建表来分隔约束(如您的评论中所见)。

测试约束也很容易。只需创建这两个额外的虚拟表:

CREATE TABLE People2 OF PersonType
OBJECT IDENTIFIER IS SYSTEM GENERATED;

CREATE TABLE Competitions2 OF CompetitionType
OBJECT IDENTIFIER IS SYSTEM GENERATED;

然后:

INSERT INTO People VALUES('p1');
INSERT INTO People2 VALUES('p21');
INSERT INTO Competitions VALUES('c1');
INSERT INTO Competitions2 VALUES('c21');
COMMIT;
INSERT INTO Applications
VALUES
(
   (SELECT REF(p) FROM People p WHERE person = 'p1'),
   (SELECT REF(c) FROM Competitions2 c WHERE competition = 'c21'),
   SYSDATE
);

导致 ORA-22889,因为引用的值不在指定的范围表中(这是 Competitions,而不是虚拟 Competitions2)。 您可以使用 People2 而不是 People 进行类似的测试。

【讨论】:

  • 感谢您的回答,马吕斯。当我得到那个错误时,我没有使用“或”,我的代码看起来和你的完全一样(除了我有用“”包围的表、类型和属性名称)。我再次尝试,再次创建了所有类型和表格,但它仍然对我不起作用,即使没有“”(尽管它不应该与它有任何关系)?我的代码和你的一模一样。
  • 请编辑您的问题并发布您使用的整个 SQL(CREATE TYPE/TABLE、INSERTS 等),以便我查看。
  • 我刚刚再次查看了我的代码,我的 CREATE TABLE 语句中有一个愚蠢的拼写错误,在最后一个产生 SQL 错误的约束的末尾有一个昏迷。现在可以了。 :) 感谢您对约束测试的帮助和建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2014-09-24
相关资源
最近更新 更多