2010-12-01 72 views
2

我需要一點存儲過程來執行以下邏輯?存儲過程返回序列ID列表

PROCEDURE_NAME從1(seq_name IN VARCHAR2(50),block_count IN INT,return_ids OUT)

環路block_count
return_ids:=選擇 'seq_name' || .nextVal從雙;
結束循環
回報return_ids

基本上就是我想要做的是有一個存儲過程,讓我傳遞一個序列名稱,有多少ID的需要,並返回到我的生成上市的ID,我可以在JAVA中使用。對我來說這樣做的理由是返回一個我可以在JAVA中使用的ID列表,並且沒有其他人使用這些序列ID。他們將在後續的一些其他批量插入中使用。本質上,保留一個序列ID塊。

回答

1

我會擔心在將記錄插入數據庫之前需要生成ID的邏輯。

或者,您可能需要考慮先插入行,從行中選擇id,然後使用update語句來執行批量操作。但是,直到實際信息準備插入之後,這仍然不像Java代碼不依賴於ID那樣可取。

您可以將您的信息推送到XML(或您的數據庫可以理解的任何其他數據格式),然後調用存儲過程來執行批量插入。

+0

那麼,如果我有DBA的支持,那麼我寧願將數組傳遞給一個過程,讓他們處理數據庫端的所有插入。但是因爲我沒有支持...... – stuckAtWork 2010-12-01 16:41:47

+0

我試圖插入大量的記錄到相關的分層表中。因爲我需要頂級表中的ID,所以我可以將它插入到第二級表中,等等,直到第三級和第四級表等等。我也不想在插入時使用JDBC調用數據庫來獲取ID。我只是想預取一塊可以填充各種數組的SEQ_ID,這樣我就可以在批量插入中使用這些數組了。 – stuckAtWork 2010-12-01 16:44:29

+0

我對你沒有DBA支持的評論感到困惑。您可以編寫一個存儲過程來保留ID,但無法寫入存儲過程來使用正確的ID插入到每個表中? – 2010-12-01 16:54:21

3

以下是從PL/SQL過程返回數組的一種方法。

創建一個數字的集合類型,在您的過程中初始化它並用數字填充以返回。例如:

create or replace type narray as table of number; 

create or replace procedure get_seq_ids(seq_name in varchar2, 
    block_count in number, return_ids out narray) 
as 
begin 
    return_ids := narray(); 
    return_ids.extend(block_count); 
    for i in 1 .. block_count 
    loop 
     execute immediate 'select ' || seq_name || '.nextval from dual' 
      into return_ids(i); 
    end loop; 
end; 
/
0

恕我直言,你能做的最好的事情只是引用sequence_name.nextval就在你INSERT INTO,則VALUES子句。

你說過要避免使用相同ID的其他人。參考this site

序列(或Oracle,就此而言)可確保在同一個會話中沒有其他會話或其他對nextval的調用從序列中獲得相同的編號。

因此,序列號的唯一性在Oracle中是有保證的。

0

這裏是我的Java應用程序,我支持(也使用批量插入到深層次表)

PROCEDURE get_nextvals 
( 
    p_values OUT SYS_REFCURSOR, 
    p_count IN PLS_INTEGER 
) 
IS 
    -- return the next p_count values from the PK sequence 
BEGIN 
    OPEN p_values FOR 
     SELECT 
      <schema>.<sequence>.nextval 
     FROM 
      dual 
     CONNECT BY 
      LEVEL <= p_count 
    ; 
END; 

很容易,只需通過遊標出比Java具有的應用程序使用一個表做類型在數據庫中定義。

1

另一個選項可能是使用RETURNING子句在插入後自動返回序列值。