0

三张表:

  • 用户(ID,日期)
  • 项目(id,fk_user_id)
  • item_history (id, text, fk_item_id)

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

出于历史目的,项目的数据存储在 item_history 'text' 中。

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

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

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

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

4

1 回答 1

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 表的 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;

分享和享受。

于 2013-07-31T11:09:50.893 回答