1

我正在使用 Oracle (18.4.0) 设计对象关系模型,我想向SCOPE对象表的表类型列添加约束。可能吗?这是一个简化的模型:

CREATE OR REPLACE TYPE t_cycler AS OBJECT (
    name VARCHAR2(50)
);

CREATE TABLE cycler OF t_cycler (
    name PRIMARY KEY
);


CREATE OR REPLACE TYPE t_cycler_list IS TABLE OF REF t_cycler;

CREATE OR REPLACE TYPE t_team AS OBJECT (
    name VARCHAR2(50),
    cyclers t_cycler_list
);

CREATE TABLE team OF t_team (
    name PRIMARY KEY
)
NESTED TABLE cyclers STORE AS cyclers_tab;

我需要team.cyclers只包含REFs 中的对象cycler。我查看了文档,但不幸的是它并没有说明很多关于SCOPE约束的内容,比如这里

您可以约束列类型、集合元素或对象类型属性以引用指定的对象表。声明 REF 时使用 SQL 约束子条款 SCOPE IS。

但它提供的唯一示例是关于一个简单的列类型。我尝试SCOPE IS cyclerteam表的创建中以多种方式指定,但没有结果。

4

1 回答 1

4

您想将范围添加到COLUMN_VALUE嵌套表的伪列:

ALTER TABLE cyclers_tab ADD SCOPE FOR ( COLUMN_VALUE ) IS cycler;

如果你这样做:

INSERT INTO cycler ( name ) VALUES ( 'c1.1' );
INSERT INTO cycler ( name ) VALUES ( 'c1.2' );

INSERT INTO team (
  name,
  cyclers
) VALUES (
  'team1',
  t_cycler_list(
    ( SELECT REF(c) FROM cycler c WHERE name = 'c1.1' ),
    ( SELECT REF(c) FROM cycler c WHERE name = 'c1.2' )
  )
);

然后您可以插入该行。但是,如果您有另一个相同对象类型的表:

CREATE TABLE cycler2 OF t_cycler (
    name PRIMARY KEY
);

INSERT INTO cycler2 ( name ) VALUES ( 'c2.1' );

并尝试这样做:

INSERT INTO team (
  name,
  cyclers
) VALUES (
  'team2',
  t_cycler_list(
    ( SELECT REF(c) FROM cycler2 c WHERE name = 'c2.1' )
  )
);

然后你得到错误:

ORA-22889: REF value does not point to scoped table

db<>在这里摆弄

于 2020-12-05T22:09:35.947 回答