2012-02-07 2 views
-2

문제를 해결할 수 없어 완전히 고착되었습니다.명시 적 커서를 사용하여 두 개의 다른 테이블 (table1 & table2)에서 새로 생성 된 세 번째 테이블 (table3)으로 데이터 복사

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); 

지금 내가 사용 table1table2에서 데이터를 채우려는 세 번째 테이블 (table3를) 생성 :

는 난 내가 만든 데이터로 채워 두 개의 테이블 (table1table2있어 . 표 1의 데이터로 내가 (표 3)을 채울 수있는 방법

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

: 익명 PL-SQL blockexplicit cursor는이 같은 세 번째 테이블을 생성 및 table2? 나는 또한 단지 200 hk 이상을 가지고있는 사람들의 데이터로 그것을 채우기를 원한다. (table1을 보라). 이 문제를 어떻게 해결할 수 있습니까? 내가 얻을 수있는 모든 도움에 감사드립니다. 익명 PL/SQL 블록에서 명시 적 커서로

+2

그것은 단지 pnr에 가입 한 것입니까? 왜 커서를 원하십니까? 안으로 삽입하거나 선택하십시오. 오라클이 사용하는 두 가지 오라클 중 어느 것이나 두 가지 오라클 사용 모두 잘 수행 할 것임을 기억할 수 없습니다. 오, 나도 너를 채점 한 사람이 아니야. 비록 당신이 아마 당신의 노력에 명백한 부족에 대한 자격이 있지만. 이 장소는 사람들이 먼저 가야한다는 것을 보여줄 것으로 기대합니다. –

답변

0

당신의 도움에 감사드립니다 :) 나는 다음과 같은 방법으로 해결했습니다.

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; 
2

:

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; 

는 ... 희망이 도움이