在Oracle中设置对象类型表的主键

时间:2010-03-08 07:16:03

标签: oracle database

我有两个Oracle问题。

  1. 当表格由对象类型组成时,如何设置表格的主键?例如

      

    CREATE TABLE object_names OF object_type

  2. 我创建了一个Varray类型

      

    创建类型MULTI_TAG作为VARCHAR(10)的VARRAY(10);

    但是当我尝试做的时候

      

    SELECT p.tags.count FROM pg_photos p;

    我在“count”部分遇到无效的标识符错误。 p.tags是一个MULTI_TAG,如何获取MULTI_TAG中的元素数量?

2 个答案:

答案 0 :(得分:2)

首先,我不建议在Object表中存储数据。对象是一个很好的编程工具,但查询对象表会导致复杂的SQL。我建议将数据存储在标准关系模型中,并使用程序中的对象。

现在回答你的问题:

  1. 主键应该是不可变的,因此大多数情况下,Object类型不适合主键。您应该定义surrogate key来引用您的对象。

  2. 您必须将varray转换为表才能从SQL查询

  3. 例如:

    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
    

答案 1 :(得分:0)

1)
主键是约束,要在对象表上添加约束,请检查此链接:
http://download-west.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjdes.htm#i452285

2)
COUNT方法不能在SQL语句中使用:
REF LINK in COMMENTS

所以在我的情况下我必须做

  

SELECT p.pid AS pid,count(*)AS num_tags FROM pg_photos p,TABLE(p.tags)t2 GROUP BY p.pid;