2013-07-31 4 views
0

세 개의 테이블에서 여러 해당 항목을 만들 :두 테이블

  • 사용자 (ID, 날짜)
  • 항목 (아이디, fk_user_id)
  • item_history (ID, 텍스트, fk_item_id)

특정 날짜 이전에 생성 된 모든 사용자는 새 항목을 가져와야합니다.

항목의 데이터는 기록 목적으로 item_history '텍스트'에 저장됩니다.

새 항목의 텍스트는 모든 사용자에게 동일합니다.

꽤 많은 사용자가 있기 때문에 모든 사용자에 대해 새 항목 및 해당 item_histories를 만들 수있는 스크립트가 필요합니다.

이것은 SQL로 할 수 없다고 생각합니다. 내 PLSQL 지식은 기본적으로 존재하지 않습니다.

나는 새 항목을 가져야하는 사용자를 선택했으나 항목과 항목에 대한 새 항목을 만드는 방법에 대한 단서가 없습니다.

+0

item.id 및 item_history.id 열을 어떻게 복제합니까? 정의 된 순서가 있습니까? – schurik

+0

@schurik 예, 죄송합니다. 그 점을 잊어 버렸습니다. – BOb

답변

1

보십시오 : 당신은 내가 시퀀스 이름을 만든 ITEM.ID 및 ITEM_HISTORY.ID 열을 사용하는 우리에게 시퀀스의 이름을 말하지 않았기 때문에

CREATE PROCEDURE ADD_ITEM_TEXT(pin_Text IN VARCHAR2) IS 
    nItem_id ITEM.ID%TYPE; 
BEGIN 
    FOR aRow IN (SELECT ID FROM USER) 
    LOOP 
    INSERT INTO ITEM(ID, FK_USER_ID) 
    VALUES (ITEM_ID_SEQ.NEXTVAL, aRow.ID) 
    RETURNING ID INTO nItem_id; 

    INSERT INTO ITEM_HISTORY(ID, TEXT, FK_ITEM_ID) 
    VALUES (ITEM_HISTORY_ID_SEQ.NEXTVAL, pin_Text, nItem_id); 
    END LOOP; 

    COMMIT; 

    DBMS_OUTPUT.PUT_LINE('All changes committed'); 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Exception: ' || SQLCODE || ':' || SQLERRM); 
    ROLLBACK; 
    DBMS_OUTPUT.PUT_LINE('All changes ROLLED BACK'); 
END ADD_USER_ITEM; 

것은 - 내 "만들어 낸"을 대체 이름 (ITEM 테이블의 경우 ITEM_ID_SEQ, ITEM_HISTORY 테이블의 경우 ITEM_HISTORY_ID_SEQ)과 올바른 시퀀스 이름.

위의 절차를 만듭니다. 그것을 사용하려면 다음과 같이 호출해야합니다 :

BEGIN 
    ADD_ITEM_TEXT('Text for an item'); 
    ADD_ITEM_TEXT('Text for another item'); 
    ADD_ITEM_TEXT('Text for the last item'); 
END; 

공유하고 즐기십시오.