在两个表中创建多个相应的条目

时间:2013-07-31 10:24:32

标签: sql oracle plsql

三张桌子:

  • 用户(id,日期)
  • item(id,fk_user_id)
  • item_history(id,text,fk_item_id)

在特定日期之前创建的所有用户都需要获得新项目。

该项目的数据存储在item_history“文本”中以用于历史记录。

这些新项目的文本对所有用户都是相同的。

由于有很多用户,我需要一个可以为所有用户创建新项目和相应item_histories的脚本。

我想这不能用SQL完成,我的PLSQL知识基本上不存在?

我已经选择了应该获得新项目的用户,但我不知道如何为他们创建新项目以及那些项目item_histories。

1 个答案:

答案 0 :(得分:1)

尝试:

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.ID和ITEM_HISTORY.ID列的序列名称,因此我编写了序列名称 - 替换了我的“虚拟”名称(ITEM表为ITEM_ID_SEQ,ITEM_HISTORY_ID_SEQ为具有正确序列名称的ITEM_HISTORY表。

以上创建了一个程序。要使用它,您需要按如下方式调用它:

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

分享并享受。