Domanda

Sto cercando di convertire le query come di seguito per i tipi in modo che non dovrò usare 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

di cui sopra è solo un esempio, ma query complesse sono più grande di questo.
quanto sopra è all'interno di una stored procedure. Quindi, per evitare il GTT (my_gtt_table_1). Ho fatto la seguente:

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 

Ora, nella SP:

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

In quanto sopra non sono sicuro di cosa tavolo per mettere la mia interrogazione ha subquery nidificate.

query nel SP: (sto cercando questo per scopo di esempio per vedere se funziona)

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

Io sono sempre errori come: ORA-00913: troppi valori

Sono molto confuso e bloccato con questo: (

È stato utile?

Soluzione

È definito un tipo con 6 gli attributi e si tenta di creare un'istanza con Valori 7. Prova a modificare:

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

Modifica Ci sembra anche essere una confusione per quanto riguarda i tipi. In Oracle è possibile definire i tipi di SQL o in PL / SQL. tipi SQL sono accessibles a SQL (!), mentre quelli PL / SQL offrono alcune funzioni extra, ma sono invisibili al puro SQL (PL / SQL può anche tipi SQL di accesso).

Detto questo, si è confusa e poco saggio tipi di nome lo stesso sia in SQL e PL / SQL (si esegue in shadowing problemi ). È stato definito il tipo lname_exact due volte (con la vostra istruzione CREATE e nel tuo blocco declare). Dal momento che si un'istanza di un lname_exact in un'istruzione SQL, il tipo scelto in questo caso è il tipo SQL (con solo 6 attributi).

Si dovrebbe rimuovere sia la dichiarazione di lname_exact sulla SP o rinominarlo.

Altri suggerimenti

Oltre alla risposta eccellente di Vincent: Non è necessario creare esplicitamente un lname_row nella query SQL. MASSA COLLECT abbinerà automaticamente le colonne selezionate con i campi del target INTO. Quindi, in base a ciò che hai dimostrato finora, non è necessario creare tipi a livello di schema, è sufficiente definirli nel blocco PL / SQL.

Ecco un semplice esempio che le opere:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top