2016-11-30 9 views
1

Ich habe das folgende Code-Snippet, um Zeilen in t1-Tabelle einzufügen, aber wenn ich die Prozedur ausführen, werden keine Zeilen in t1-Tabelle aufgefüllt.FORALL INSERT Keine Zeilen einfügen

CREATE OR REPLACE PROCEDURE my_proc 
IS 
    TYPE rt_t1 IS TABLE OF t1%ROWTYPE 
        INDEX BY BINARY_INTEGER; 

    vrt_t1  rt_t1; 

    TYPE t_emp_no_list IS TABLE OF t1.emp_no%TYPE 
          INDEX BY BINARY_INTEGER; 

    TYPE t_emp_name_list IS TABLE OF t1.emp_name%TYPE 
           INDEX BY BINARY_INTEGER; 

    TYPE t_loc_name_list IS TABLE OF t1.loc_name%TYPE 
           INDEX BY BINARY_INTEGER; 

    TYPE t_hire_date_list IS TABLE OF t1.hire_date%TYPE 
           INDEX BY BINARY_INTEGER; 


    l_emp_no  t_emp_no_list; 
    l_emp_name t_emp_name_list; 
    l_loc_name t_loc_name_list; 
    l_hire_date t_hire_date_list; 
BEGIN 
    SELECT empno, 
      ename, 
      loc, 
      hiredate 
    BULK COLLECT INTO l_emp_no, 
      l_emp_name, 
      l_loc_name, 
      l_hire_date 
    FROM (SELECT empno, 
        ename, 
        dept.loc, 
        emp.hiredate 
      FROM emp JOIN dept ON emp.deptno = dept.deptno); 

    FORALL i IN vrt_t1.FIRST .. vrt_t1.LAST 
     INSERT INTO t1 (emp_no, 
         emp_name, 
         loc_name, 
         hire_date) 
      VALUES (l_emp_no (i), 
        l_emp_name (i), 
        l_loc_name (i), 
        l_hire_date (i)); 


    COMMIT; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     RAISE; 
END; 
+0

Sie sind Bulk-Sammel in l_emp_no wenn über vrt_t1 laufen. Nicht gut. – arturro

+0

Wie Sie gesagt haben, füllen Sie nicht alle Spalten Ihrer Zieltabelle..Wenn Sie die 'vrt_t1' verwendet haben, hat sie alle Spalten der Tabelle t1 geerbt. und während des Einfügens wäre es gescheitert – XING

+0

Überprüfen Sie meine Bearbeitung .. Es funktioniert und getestet. – XING

Antwort

2

Sie sollten den Cursor verwenden, um Ihre Anforderung zu erfüllen. Siehe unten:

CREATE OR REPLACE PROCEDURE my_proc 
IS 
    TYPE rt_t1 IS TABLE OF t1%ROWTYPE 
     INDEX BY BINARY_INTEGER; 

    vrt_t1  rt_t1; 

    cursor cur is 
    SELECT empno, 
        ename, 
        dept.loc, 
        emp.hiredate 
      FROM emp JOIN dept ON emp.deptno = dept.deptno; 


BEGIN 

    OPEN cur; 
    fetch cur BULK COLLECT INTO vrt_t1; 
    close cur; 

    FORALL i IN 1 .. vrt_t1.count 
     INSERT INTO t1 
      VALUES vrt_t1(i); 


    COMMIT; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     RAISE; 
END; 

PS: Der obige Code funktioniert, wenn die Anzahl der Spalten beider Tabellen gleich ist;

BEARBEITEN ..In dem Fall, dass Sie bestimmte Zeilen in eine Tabelle einfügen, müssen Sie einen RECORD erstellen, um dies zu tun. Siehe folgendes Beispiel. Ihr Code schlägt fehl, weil Sie versuchen, mehrere Sammlungen auf einmal einzufügen. In Ihrem Fall wäre die erste Kollation eine Beilage und andere sollten eine Aktualisierung sein.

CREATE TABLE t1 
(
    emp_no  NUMBER, 
    emp_name VARCHAR2 (30), 
    loc_name VARCHAR2 (30), 
    hire_date DATE 
); 

-------------- 


SQL> select * from t1; 

    no rows selected 

CREATE OR REPLACE PROCEDURE my_proc 
IS 

    TYPE TBL IS RECORD 
    (
    emp_no number, 
    emp_name varchar2(100), 
    loc_name varchar2(100), 
    hire_date date 
    ); 

    TYPE t_emp IS TABLE OF TBL INDEX BY PLS_INTEGER; 

    var_emp_det t_emp; 


BEGIN 
    SELECT ENO, 
      ENAME, 
      JOB, 
      HIREDATE   
    BULK COLLECT INTO var_emp_det 
    from emp_sal; 

    FORALL i IN 1..var_emp_det.count 
     INSERT INTO t1 (emp_no, 
        emp_name, 
        loc_name, 
        hire_date) 
     values (var_emp_det(i).emp_no, 
        var_emp_det(i).emp_name, 
        var_emp_det(i).loc_name, 
        var_emp_det(i).hire_date);   

    COMMIT; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     RAISE; 
END; 

Ausgang:

SQL> execute my_proc; 

PL/SQL procedure successfully completed. 

SQL> select * from t1; 

    EMP_NO EMP_NAME      LOC_NAME 
---------- ------------------------------ ------------------------------ 
HIRE_DATE 
--------- 
     2 Thomas       IT 
03-JAN-14 
+0

Ohne Cursor ist es möglich? – user75ponic

+0

Es ist möglich, warum möchten Sie dies tun, wenn Sie einen besseren Weg haben, es zu tun. – XING

+0

Der Grund, warum ich Variablen erstellt habe, ist für Spalten, die ich einfügen würde, was bedeutet, dass alle Spalten in der Tabelle nicht gefüllt werden. – user75ponic