2010-05-11 54 views
4

我試圖創建一個可以部署在多個數據庫上的發佈腳本,但是可以在稍後的日期將數據合併到一起。處理這種情況的明顯方法是在後續部署中將生產數據的序列號設置得足夠高以防止衝突。動態地爲Oracle序列設置「Start With」值

問題出現在發佈腳本中,該腳本將接受環境編號並適當設置序列的「Start With」值。理想情況下,我想用這樣的:

ACCEPT EnvironNum PROMPT 'Enter the Environment Number: ' 
--[more scripting] 
CREATE SEQUENCE seq1 START WITH &EnvironNum*100000; 
--[more scripting] 

這不起作用,因爲你無法評估DDL數字表達式。

另一種選擇是使用動態SQL通過PL/SQL創建序列。

ACCEPT EnvironNum PROMPT 'Enter the Environment Number: ' 
--[more scripting] 
EXEC execute immediate 'CREATE SEQUENCE seq1 START WITH ' || &EnvironNum*100000; 
--[more scripting] 

但是,我寧願避免這種解決方案,因爲我通常會盡量避免在PL/SQL中發出DDL。

最後,我想出的第三個選項只是將Start With值接受爲替代變量,而不是環境編號。

有沒有人有更好的想法如何去做這件事?

回答

7

可以使用COLUMN XX NEW_VALUE YY語法在SQL進行計算* Plus並將結果存儲在變量中:

SQL> col sequence_num new_value seq 
SQL> select &EnvironNum * 1000000 sequence_num from dual; 
Enter value for environnum: 2 
old 1: select &EnvironNum * 1000000 sequence_num from dual 
new 1: select 2 * 1000000 sequence_num from dual 

SEQUENCE_NUM 
------------ 
    2000000 

SQL> create sequence scott.seq1 start with &seq; 
old 1: create sequence scott.seq1 start with &seq 
new 1: create sequence scott.seq1 start with 2000000 

Sequence created. 
+0

很好的答案。這正是我所期待的。 – Allan 2010-05-11 16:13:58

+0

+1 - 按規定解決問題 – dpbradley 2010-05-11 16:39:14

+0

+1簡單,優雅,無需過程。 – iamnotmaynard 2014-01-09 18:04:00

4

如果您擁有數量合理的數據庫,您可以使用不同的值開始序列,然後定義一個增量,以便序列值不會發生衝突。這會消除起始值中的表達式。

因此,如果有10個數據庫:

create sequence seq1 start with &startval increment by 10; 

和startval是1數據庫1,2對數據庫2等

(這也消除,如果增量值的重疊序列的問題成長爲一個數據庫的範圍),我用

+0

+1:雖然您需要知道環境的最大數量,但它工作正常 – 2010-05-11 15:50:30

+0

This i這是一個聰明的解決方案,它會爲我工作(我不可能有超過10個實例)。但是,我會接受文森特馬爾格拉特的答案,因爲它實際上完成了我所要做的事。 – Allan 2010-05-11 16:13:22

+0

如果有11個數據庫可能會遇到麻煩。增量的數量當然可以改變...... – FrustratedWithFormsDesigner 2010-05-11 16:13:34

1

一個竅門是從主腳本創建sqlplus的腳本,然後執行:

也許像

ACCEPT EnvironNum PROMPT 'Enter the Environment Number: ' 
spool seq_script.sql 
begin 
    dbms_output.put_line('CREATE SEQUENCE seq1 START WITH '||&EnvironNum||'*100000;') 
end; 
spool off 
@seq_script.sql 

這應該創建&EnvironNum已經評估了腳本文件(假設inputed「275」用戶爲例):

CREATE SEQUENCE seq1 START WITH 275*100000;