Frage

Ich versuche, Abfragen zu konvertieren wie unten an Typen, so dass ich nicht GTT verwenden:

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

oben ist nur ein Beispiel, aber komplexe Abfragen sind größer als diese.
Das obige ist innerhalb einer gespeicherten Prozedur. So vermeiden Sie die GTT (my_gtt_table_1). Ich habe die folgenden:

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 

Jetzt im SP:

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

In dem oben Ich bin nicht sicher, was Tisch zu legen, wie meine Abfrage verschachtelte Unterabfragen hat.

Abfrage in der SP: (Ich versuche, das für Probe Zweck, um zu sehen, ob es funktioniert)

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

Ich erhalte Fehler wie: ORA-00913: zu viele Werte

Ich bin wirklich verwirrt und fest mit diesem: (

War es hilfreich?

Lösung

Sie definiert einen Typ mit 6 Attribute und Sie versuchen, es zu instanziieren mit 7 Werte. Versuchen Sie stattdessen:

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

Bearbeiten Es scheint auch eine Verwirrung in Bezug auf Typen. In Oracle können Sie Typen in SQL oder in PL / SQL definieren. SQL-Typen sind accessibles zu SQL (!), Während PL / SQL diejenigen einige zusätzliche Funktionen bieten, sind aber unsichtbar reine SQL (PL / SQL können auch Zugriff SQL-Typen).

That being said, es ist verwirrend und unklug, Namenstypen die gleichen sowohl in SQL und PL / SQL (Sie laufen in Shadowing Ausgaben). Sie definiert die lname_exact Typ zweimal (mit CREATE-Anweisung und in Ihrem declare-Block). Da Sie eine lname_exact in einer SQL-Anweisung instanziiert wird, die gewählte Art in diesem Fall ist der SQL-Typ (mit nur 6 Attributen).

Sie sollten entweder die Deklaration von lname_exact auf der SP entfernen oder umbenennen.

Andere Tipps

Neben Vincents ausgezeichnete Antwort: Sie müssen nicht explizit eine lname_row in der SQL-Abfrage erstellen. MASSE wird COLLECT automatisch die Spalten übereinstimmen mit den ausgewählten Feldern des in Ziel. So basiert auf, was Sie bisher gezeigt haben, brauchen Sie nicht Arten auf Schemaebene zu erstellen, müssen Sie sie einfach in Ihrem PL / SQL-Block definieren.

Hier ist ein einfaches Beispiel, das funktioniert:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top