2017-03-21 2 views
0

J'ai la table customer_table contenant une liste (table imbriquée) de références vers les lignes de la table account_table.Insérer plusieurs références dans une table imbriquée

Voici mes déclarations:

Type de client:

CREATE TYPE customer as object(
    custid integer, 
    infos ref type_person, 
    accounts accounts_list 
); 

type accounts_list:

CREATE TYPE accounts_list AS table of ref account; 

Tableau:

CREATE TABLE customer_table OF customer(
    custid primary key, 
    constraint c_inf check(infos is not null), 
    constraint c_acc check(accounts is not null) 
) 
NESTED TABLE accounts STORE AS accounts_refs_nt_table; 

Je voudrais donc insérer plusieurs refs dans ma table imbriquée lorsque je crée un client, car un compte peut être partagé.

Je ne trouve pas comment faire cela.

J'ai essayé:

INSERT INTO customer_table(
    SELECT 0, 
    ref(p), 
    accounts_list(
     SELECT ref(a) FROM account_table a WHERE a.accid = 0 
     UNION ALL 
     SELECT ref(a) FROM account_table a WHERE a.accid = 1 
    ) 
    FROM DUAL 
    FROM person_table p 
    WHERE p.personid = 0 
); 

sans succès.

Merci

Répondre

1

Vous pouvez utiliser the collect() function, par exemple dans une sous-requête:

INSERT INTO customer_table(
    SELECT 0, 
    ref(p), 
    (
     SELECT CAST(COLLECT(ref(a)) AS accounts_list) 
     FROM account_table a 
     WHERE accid IN (0, 1) 
    ) 
    FROM person_table p 
    WHERE p.personid = 0 
); 

Comme la documentation dit: « Pour obtenir des résultats précis de cette fonction, vous devez l'utiliser dans une fonction CAST », donc je l'ai jeté explicitement à votre type account_list.

Si vous ne voulez pas un sous-requête, vous pouvez le faire à la place:

INSERT INTO customer_table(
    SELECT 0, 
    ref(p), 
    CAST(COLLECT(a.r) AS accounts_list) 
    FROM person_table p 
    CROSS JOIN (SELECT ref(a) AS r FROM account_table a WHERE accid IN (0, 1)) a 
    WHERE p.personid = 0 
    GROUP BY ref(p) 
); 

mais je pense que c'est un peu messier; Vérifiez la performance des deux si ...