Копирование данных из двух разных таблиц (table1 & table2) в третью вновь созданную таблицу (table3) с использованием явного курсора - PullRequest
0 голосов
/ 07 февраля 2012

У меня проблема с назначением, которую я не могу исправить, и я полностью застрял.

У меня есть две таблицы (table1 и table2, которые я создал и заполнил данными:

CREATE TABLE Table1(
pnr VARCHAR2(11) PRIMARY KEY,
fnamn VARCHAR2(20),
enamn VARCHAR2(20),
bor_i VARCHAR2(20),
jobbar_i VARCHAR2(20));


CREATE TABLE Table2(
regnr VARCHAR2(6) PRIMARY KEY,
pnr REFERENCES bilägare(pnr),
tillverkare VARCHAR2(20),
modell VARCHAR2(20),
årsmodell NUMBER(4),
hk NUMBER(4),
datum DATE); 

Теперь я создал третью таблицу (table3), которую я хочу заполнить данными из table1 и table2, используя анонимные PL-SQL block и explicit cursor. Я создал третью таблицу так:

CREATE TABLE table3(
pnr VARCHAR2(11),
fnamn VARCHAR2(20),
enamn VARCHAR2(20),
regnr VARCHAR2(6),
tillverkare VARCHAR2(20),
modell VARCHAR2(20));

Как я могу заполнить его (таблица3) данными из таблицы1 и таблицы2? Я также хочу только заполнить его данными от тех, кто получил более 200 hk (посмотрите на table1). Как мне это исправить? Благодарю за помощь, которую я могу получить.

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

В качестве явного курсора в анонимном блоке PL / SQL:

DECLARE
   -- Explicit cursor
   CURSOR tab3_cur
   IS
      SELECT pnr,
             t1.fnam,
             t1.enam,
             t2.regnr,
             t2.tillverkare,
             t2.modell
        FROM table1 t1
       INNER JOIN table2 t2
       USING (pnr)
       WHERE t2.hk > 200;

   -- Collection for holding the cursor results
   TYPE tab3_cur_tabtype IS TABLE OF table3%ROWTYPE
        INDEX BY PLS_INTEGER;
   tab3_tab tab3_cur_tabtype;
BEGIN
   -- Open the cursor and fetch the records
   OPEN tab3_cur;
   FETCH tab3_cur BULK COLLECT INTO tab3_tab;
   CLOSE tab3_cur;

   -- insert all the records into table3
   FORALL x IN INDICES OF tab3_tab
      INSERT INTO table3
      VALUES (tab3(x));

   -- Commit the inserts
   COMMIT;
EXCEPTION
   WHEN others
   THEN
      -- Check the cursor is closed
      IF tab3_cur%ISOPEN
      THEN
         CLOSE tab3_cur;
      END IF;
      -- Rollback any inserted records
      ROLLBACK;
      -- Re-raise the error
      RAISE;
END;
/

Было бы намного лучше и эффективнее просто использовать:

INSERT INTO table3 (
   pnr,
   enam,
   regnr,
   tillverkare,
   modell
)
SELECT pnr,
       t1.fnam,
       t1.enam,
       t2.regnr,
       t2.tillverkare,
       t2.modell
  FROM table1 t1
 INNER JOIN table2 t2
 USING (pnr)
 WHERE t2.hk > 200;

Надеюсь, это поможет ...

0 голосов
/ 21 февраля 2012

Спасибо за вашу помощь :) Я решил это следующим образом

declare
    cursor c_fartdåre
    is
       select pnr,
              bilägare.fnamn,
              bilägare.enamn,
              fordon.regnr,
              fordon.tillverkare,
              fordon.modell
         from bilägare
        inner join fordon
        using (pnr)
        where fordon.hk > 200;
        c_fartdåre_rec c_fartdåre%rowtype;
/*v_pnr         fordon.pnr%type;
v_fnamn       bilägare.fnamn%type;
v_enamn       bilägare.enamn%type;
v_regnr       fordon.regnr%type;
v_tillverkare fordon.tillverkare%type;
v_modell      fordon.modell%type;*/
begin

if not c_fartdåre%isopen then
open c_fartdåre;
end if;

loop
fetch c_fartdåre into c_fartdåre_rec;
exit when c_fartdåre%notfound;

  insert into fartdåre(pnr, fnamn, enamn, regnr, tillverkare, modell)
  values(c_fartdåre_rec.pnr, c_fartdåre_rec.fnamn, c_fartdåre_rec.enamn, c_fartdåre_rec.regnr, c_fartdåre_rec.tillverkare, c_fartdåre_rec.modell);
end loop;


commit;
dbms_output.put_line('Kopieringen är klar!');
  end;
...