Question

Je suis en train de convertir des requêtes comme ci-dessous pour les types afin que je ne veux pas utiliser GTT:

insert into my_gtt_table_1
(house, lname, fname, MI, fullname, dob)
(select house, lname, fname, MI, fullname, dob 
 from (select 'REG' house, mbr_last_name lname, mbr_first_name fname, mbr_mi MI, 
       mbr_first_name || mbr_mi || mbr_last_name fullname, mbr_dob dob from 
       table_1 a, table_b
       where a.head = b.head and mbr_number = '01' and mbr_last_name = v_last_name) c

ci-dessus est juste un échantillon, mais des requêtes complexes sont plus grandes que cela.
ci-dessus est à l'intérieur d'une procédure stockée. Donc, pour éviter le GTT (my_gtt_table_1). Je l'ai fait ce qui suit:

create or replace type lname_row as object
    (
     house varchar2(30)
     lname varchar2(30),
     fname varchar2(30),
     MI char(1),
     fullname VARCHAR2(63),
     dob DATE
     )

create or replace type lname_exact as table of lname_row 

dans le SP:

type lname_exact is table of <what_table_should_i_put_here>%rowtype;
tab_a_recs lname_exact;

Dans ce qui précède, je ne suis pas sûr de ce que la table à mettre comme ma requête a sous-requêtes imbriquées.

requête dans la SP: (Je suis en train cette fin pour l'échantillon pour voir si cela fonctionne)

        select lname_row('',
                                '',
                                '',
                                '',
                                '',
                                '',
                                sysdate) bulk collect
          into tab_a_recs
        from table_1;

Je reçois des erreurs comme: ORA-00913: trop de valeurs

Je suis vraiment confus et coincé avec ceci: (

Était-ce utile?

La solution

Vous avez défini un type 6 et les attributs que vous essayez de instancier avec des valeurs 7 . Essayez ceci:

    select lname_row(/*'',*/
                     '',
                     '',
                     '',
                     '',
                     '',
                     sysdate) bulk collect
      into tab_a_recs
    from table_1;

Modifier Il semble également y avoir une confusion en ce qui concerne les types. Dans Oracle, vous pouvez définir des types dans SQL ou dans PL / SQL. types SQL sont accessibles à SQL (!) tandis que les PL / SQL offrent des fonctionnalités supplémentaires, mais sont invisibles à SQL pur (PL / SQL peuvent également accéder à des types SQL).

Cela étant dit, il est source de confusion et peu judicieux de types de nom, identique dans les SQL et PL / SQL (vous exécutez dans problèmes shadowing). Vous avez défini le type de lname_exact deux fois (avec votre CREATE déclaration et dans votre bloc DECLARE). Puisque vous instancier un lname_exact dans une instruction SQL, le type choisi dans ce cas est le type SQL (avec seulement 6 attributs).

Vous devriez soit supprimer la déclaration de lname_exact sur la SP ou le renommer.

Autres conseils

En plus d'une excellente réponse de Vincent: Vous n'avez pas besoin de créer explicitement un lname_row dans votre requête SQL. VRAC Collect automatiquement correspondre les colonnes sélectionnées avec les champs de la cible INTO. Donc, en fonction de ce que vous avez montré jusqu'à présent, vous n'avez pas besoin de créer des types au niveau du schéma, il vous suffit de les définir dans votre bloc PL / SQL.

Voici un exemple simple qui fonctionne:

SQL> l
  1  declare
  2    type my_row is record (x number, y date);
  3    type my_tab is table of my_row;
  4    a_table  my_tab;
  5  begin
  6  select 1,sysdate
  7      bulk collect into a_table
  8      from dual;
  9  dbms_output.put_line(a_table(1).y);
 10* end;
SQL> /
14-JUN-10
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top