在Oracle中设置对象类型表的主键
Posted
技术标签:
【中文标题】在Oracle中设置对象类型表的主键【英文标题】:Setting the primary key of a object type table in Oracle 【发布时间】:2010-03-08 07:16:02 【问题描述】:我有两个 Oracle 问题。
当表由对象类型组成时,如何设置表的主键?例如
CREATE TABLE object_names OF object_type
我已经创建了一个 Varray 类型,
CREATE TYPE MULTI_TAG AS VARRAY(10) OF VARCHAR(10);
但是当我尝试这样做时
从 pg_photos p 中选择 p.tags.count;
“计数”部分出现无效标识符错误。 p.tags 是一个 MULTI_TAG,如何获取 MULTI_TAG 中的元素个数?
【问题讨论】:
欢迎来到 ***!正如您已经意识到的那样,您问了 两个 Oracle 问题。因此,请编辑此问题以删除一个问题,并将其作为一个单独的问题提出。 【参考方案1】:首先,我不建议将数据存储在 Object 表中。对象是一个很好的编程工具,但查询对象表会导致复杂的 SQL。我建议将您的数据存储在标准关系模型中并在您的过程中使用对象。
现在回答你的问题:
主键应该是不可变的,因此大多数时候 Object 类型不适合主键。您应该定义一个surrogate key 来引用您的对象。
您必须将 varray
转换为表才能从 SQL 查询它
例如:
SQL> CREATE TYPE MULTI_TAG AS VARRAY(10) OF VARCHAR(10);
2 /
Type created
SQL> CREATE TABLE pg_photos (ID number, tags multi_tag);
Table created
SQL> INSERT INTO pg_photos VALUES (1, multi_tag('a','b','c'));
1 row inserted
SQL> INSERT INTO pg_photos VALUES (2, multi_tag('e','f','g'));
1 row inserted
SQL> SELECT p.id, COUNT(*)
2 FROM pg_photos p
3 CROSS JOIN TABLE(p.tags)
4 GROUP BY p.id;
ID COUNT(*)
---------- ----------
1 3
2 3
【讨论】:
我同意使用对象表确实很复杂,不幸的是我没有选择余地。作业要求我使用对象关系功能。感谢您的意见。我已经通过 vark.com 找到了答案,但我没有使用 CROSS JOIN,所以我需要研究一下它的作用。 @Rek: 交叉连接是 没有 连接条件的连接。在您的回答中,您加入了pg_photos
和 TABLE(p.tags)
没有 where 子句,这是一个交叉连接。【参考方案2】:
1) 主键是一个约束,要在对象表上添加约束,请查看此链接:http://download-west.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjdes.htm#i452285
2) SQL 语句中不能使用 COUNT 方法: 参考评论中的链接
所以在我的情况下,我必须这样做
SELECT p.pid AS pid, count(*) AS num_tags FROM pg_photos p, TABLE(p.tags) t2 GROUP BY p.pid;
【讨论】:
#2 的链接是download.oracle.com/docs/cd/B14117_01/appdev.101/b10807/…以上是关于在Oracle中设置对象类型表的主键的主要内容,如果未能解决你的问题,请参考以下文章