2014-03-06 212 views
0

我有MAIN_TABLE,它包含700萬條記錄。我不得不00001. 00000 - 「唯一約束(%s。%s)違反」

  1. 保持最近3個月的數據在MAIN_TABLE
  2. 歸檔過去的4至12個月的數據中MAIN_TABLE_ARCHIVAL
  3. 清除所有數據早於12個月

我創建了一個存儲過程一個從MAIN_TABLE複製到MAIN_TABLE_ARCHIVAL的遊標。我有複合主鍵(CONSTRAINT「PK_MAIN_TABLE」PRIMARY KEY(「SERVICE」,「TR_SOURCE」,「TR_ID」)

複製時我得到00001. 00000 - 「唯一約束(%s。%s)違反「即使我沒有插入任何重複鍵,但在同一時間記錄錯誤會被複制到MAIN_TABLE_ARCHIVE

我的代碼是這樣(我有大約20場,所以我不粘貼整個代碼):

DECLARE 
    c_id customers.id%type; 
    c_name customers.name%type; 
    c_addr customers.address%type; 

    CURSOR c_customers is 
    SELECT id, name, address FROM customers; 
BEGIN 
    OPEN c_customers; 
    LOOP 
    FETCH c_customers into c_id, c_name, c_addr; 
    EXIT WHEN c_customers%notfound; 
    dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); 
    commit; 
    END LOOP; 
    CLOSE c_customers; 
END; 
/

我試圖調試,但沒有運氣,因爲我是PL/SQL新手。請問任何人可以告訴我爲什麼會發生這種情況? e以上任務?

回答

0

要將數據從一個表複製到另一個表,不需要任何光標。你甚至不需要存儲過程。你可以用一個簡單的sql語句做到這一點:

insert into MAIN_TABLE_ARCHIVAL select * from MAIN_TABLE where <...your condition...> 

爲了提高性能,你可以使用「+ append」提示。

+0

確定嗎?即使對於具有日誌追加功能的表,也會將數據放入新擴展區,有時甚至會比通常的插入更快。 –

+0

該任務的最有效解決方案將使用分區。如果兩個表均按月分區,則可以通過交換分區(不包括任何數據移動)將數據從一個表移動到另一個表。但我認爲這樣的解決方案對於新手來說太複雜了。 –

+0

MAIN_TABLE由大約800萬條記錄組成。如果我們使用簡單的insert into - select * from - 語句,會不會有任何性能問題。我讀過關於批量複製的地方會提高性能。我們也可以實現所有三個1)保留最近3個月的數據在MAIN_TABLE 2)存檔最後4到12個月的數據MAIN_TABLE_ARCHIVAL 3)通過在上面的語句中添加一些條件清除所有超過12個月的數據。 – vkreddy

相關問題