我有两个Oracle问题。
当表格由对象类型组成时,如何设置表格的主键?例如
CREATE TABLE object_names OF object_type
我创建了一个Varray类型
创建类型MULTI_TAG作为VARCHAR(10)的VARRAY(10);
但是当我尝试做的时候
SELECT p.tags.count FROM pg_photos p;
我在“count”部分遇到无效的标识符错误。 p.tags是一个MULTI_TAG,如何获取MULTI_TAG中的元素数量?
答案 0 :(得分:2)
首先,我不建议在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
答案 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;