2010-03-08 8 views
0

J'ai deux questions Oracle.Définition de la clé primaire d'une table de type d'objet dans Oracle

  1. Comment puis-je mettre la clé primaire d'une table lorsque la table est composée d'un type d'objet? par exemple.

    CREATE TABLE DE object_names object_type

  2. j'ai créé un type Varray,

    CREATE TYPE AS MULTI_TAG VARRAY (10) de VARCHAR (10);

    mais lorsque je tente de faire

    SELECT p.tags.count DE pg_photos p;

    Je reçois une erreur d'identificateur invalide sur la partie "count". p.tags est un MULTI_TAG, comment puis-je obtenir le nombre d'éléments dans le MULTI_TAG?

+0

Bienvenue dans StackOverflow! Comme vous l'avez déjà compris, vous avez demandé ** deux questions Oracle **. Donc s'il vous plaît modifier cette question pour en supprimer un, et posez-le comme une question distincte à la place. –

Répondre

2

Tout d'abord, je ne recommanderais pas de stocker des données dans des tables d'objets. Les objets sont un excellent outil de programmation, mais l'interrogation des tables d'objets conduit à un SQL compliqué. Je conseillerais de stocker vos données dans un modèle relationnel standard et d'utiliser les objets dans vos procédures.

Maintenant, pour répondre à vos questions:

  1. Une clé primaire doit être immuable, donc la plupart du temps un type d'objet est inapproprié pour une clé primaire. Vous devez définir un surrogate key pour référencer votre objet.

  2. Vous devrez convertir le varray en une table pour pouvoir l'interroger à partir de SQL

Par exemple:

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 
+0

Je suis d'accord en utilisant des tables d'objets sont vraiment compliquées, malheureusement, je n'ai pas le luxe du choix. Devoirs exige que j'utilise des fonctionnalités relationnelles. Merci pour vos conseils. J'ai déjà trouvé la réponse via vark.com, mais je n'ai pas utilisé CROSS JOIN, donc je vais devoir regarder ce que ça fait. – Rek

+0

@Rek: une jointure croisée est une jointure ** sans condition de jointure **. Dans votre réponse, vous avez joint 'pg_photos' avec' TABLE (p.tags) 'sans clause where, c'est une jointure croisée. –

0

1)
Une clé primaire est une contrainte Pour ajouter des contraintes sur les tables d'objets, cochez ce lien:
http://download-west.oracle.com/docs/cd/B28359_01/appdev.111/b28371/adobjdes.htm#i452285

2)
La méthode COUNT ne peut pas être utilisé dans une instruction SQL:
REF LINK EN COMMENTAIRES

Donc, dans mon cas, je devais faire

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

+0

Le lien pour # 2 est http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10807/05_colls.htm#i27396 – Rek

Questions connexes