2010-02-15 76 views
2

我試圖查看是否存在某些東西來創建一個具有分區邏輯的序列。 我需要依賴於其他主鍵的前一個序列號:Oracle分區序列

id_person sequence id 
     1 | 1 
     1 | 2 
     2 | 1 
     3 | 1 
     1 | 3 

這樣的順序必須依靠id_person分區。在oracle上是否有這樣的東西,或者我必須在應用程序級別自己實現它?

謝謝。


嗨具有建立這個PLSQL包一個函數和過程:

PROCEDURE INIT_SEQUENCE(NAME varchar2, pkColumnNameList PARTITIONED_SEQUENCE_PK_COLUMN); 
FUNCTION GET_NEXT_SEQUENCE_VALUE(NAME varchar2, pkPartitionColValue PARTITIONED_SEQUENCE_COL_VALUE) RETURN NUMBER; 

INIT_SEQUENCE - 獲得輸入的序列關聯的名稱和列名的列表,被固定的主鍵的一部分該序列例如:'ID_PERSON'

該過程的工作是創建將根據pkColumnNameList列管理序列增量的表。

GET_NEXT_SEQUENCE_VALUE-獲得序列的名稱來增加和pkColumnNameList主鍵的值和使下一個步驟: 1)動態地創建SQL工作 2)dbms_lock.allocate_unique();鎖定表格 3)檢查表格中是否存在表格中的記錄,用於輸入 中的pk值4)如果存在記錄更新記錄在序列列中具有max + 1 5)如果不存在記錄插入在序列欄中輸入1的新記錄 6)返回新的ID;

我想收到有關此先謝謝了評論...

+0

你能詳細說明什麼是序列號列嗎? – FerranB 2010-02-15 15:59:39

+1

有多少人的身份證你會有1-10或100,000的......有沒有差距?如果只有少數人ID會製作n個序列 - 也就是說,如果允許有空位。不關注併發問題的人們,顯然這不是一個嚴肅的應用程序,有數百個併發連接插入到這個表中。是嗎? – 2010-02-15 16:53:04

+1

那裏有點諷刺,但總的來說我很認真。人們在詢問您期望插入多少插件之前就會開始關注併發性。如果您每小時有10個插頁,wtf會關心嗎? – 2010-02-15 23:37:30

回答

0

恐怕你必須做這樣的:

INSERT INTO t 
(
    id_person, 
    sequence_id 
) 
VALUES 
( 
    <your_person_id>, 
    (SELECT 1 + NVL(MAX(sequence_id), 0) 
    FROM t 
    WHERE t.id_person = <your_person_id> 
) 
) 
+0

感謝這個想法,我試圖實現一個包pl-sql來製作這種序列 – Macdeveloper 2010-02-15 12:11:16

+1

您需要處理2個用戶同時嘗試插入的情況 - 一個會因PK違反。 – 2010-02-15 13:03:56

+0

爲什麼不只是使用正常的序列,而不是依賴於人?如果需要,您仍然可以向客戶端應用程序呈現依賴於人員的訂單號。 – 2010-02-15 14:00:26

4

是實際需求的二次序列沒有空隙?如果是這樣,你就有一個巨大的序列化/可伸縮性問題。

如果您需要爲人類消費呈現無間隙序列,那麼您可以使用實際的序列(或時間戳)作爲Nick Pierpont建議並保留可擴展性,您可以使用分析函數。

數據集(T1):

ID_PERSON SEQUENCE_ID 
---------- ----------- 
     1   1 
     2   2 
     3   3 
     1   4 
     1   5 
     1   6 
     2   7 
     3   8 
     1   9 

SQL:

select * 
    from 
    (select id_person, 
      sequence_id as orig_sequence_id,   
      rank() 
      over (partition by id_person 
        order by sequence_id) 
      as new_sequence_id 
    from t1 
) 
order by id_person, new_sequence_id; 

結果:

ID_PERSON ORIG_SEQUENCE_ID NEW_SEQUENCE_ID 
---------- ---------------- --------------- 
     1    1    1 
     1    4    2 
     1    5    3 
     1    6    4 
     1    9    5 
     2    2    1 
     2    7    2 
     3    3    1 
     3    8    2 
+0

+1,很好的解決方案。避免存儲二級序列及其伴隨的維護/性能問題。 – DCookie 2010-02-15 18:54:49

+1

巨人? GIANT系列化問題......每天插入10條記錄?這個數字從哪裏來?我做了它,就像你必須確定是否有真正的併發問題一樣。他可能會也可能不會有併發問題。 – 2010-02-15 23:36:38

+1

@Stephanie Page:介紹序列化的設計不會擴展。無論是玩具應用還是最終,序列化都會咬住使用「select max(column)+ 1」「pattern」的設計。遠不容易引入序列化。 – 2010-02-16 04:00:43

0

你要找的是不是一個sequence,如Oracle文檔要求: 「序列發生器提供了一系列連續的數字」

您正在尋找一個計算字段取決於另一個,在這種情況下,主鍵。正如其他建議你需要在你的代碼中添加邏輯。這意味着在procedureinsert句子。

+0

我已經創建了一個管理這種od序列的olsql包,並使用dbms_lock來執行對concurncy的控制。每一種序列都有一個表cor計算。在這一天晚些時候,我會在這篇文章中發佈代碼,我想'共享這個想法,看看它是否設計得很好 – Macdeveloper 2010-02-16 07:25:48