oracle中一個(gè)序列可為好多個(gè)表使用,所以無(wú)法獲得,指定某個(gè)表使用就可以。
成都創(chuàng)新互聯(lián)公司一直通過(guò)網(wǎng)站建設(shè)和網(wǎng)站營(yíng)銷(xiāo)幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以網(wǎng)站建設(shè)、成都做網(wǎng)站、移動(dòng)互聯(lián)產(chǎn)品、成都全網(wǎng)營(yíng)銷(xiāo)推廣服務(wù)為核心業(yè)務(wù)。十余年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開(kāi)發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。
創(chuàng)建序列語(yǔ)法:
CREATE?SEQUENCE?seqTest
INCREMENT?BY?1?--?每次加幾個(gè)
START?WITH?1?--?從1開(kāi)始計(jì)數(shù)
NOMAXvalue?--?不設(shè)置最大值
NOCYCLE?--?一直累加,不循環(huán)
CACHE?10;?--設(shè)置緩存cache個(gè)序列,如果系統(tǒng)down掉了或者其它情況將會(huì)導(dǎo)致序列不連續(xù),也可以設(shè)置為---------NOCACHE
你可以先申明一個(gè)變量然后將序列值插入到變量當(dāng)中就可以了 例如
declare p_seq number;
begin
select SEQ_MID.NEXTVAL into p_seq from dual;
dbms_output.put_line( 'MSG'||p_seq);
end;
/
在oracle中sequence就是所謂的序列號(hào),每次取的時(shí)候它會(huì)自動(dòng)增加,一般用在需要按序列號(hào)排序的地方。
1、Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權(quán)限,
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加幾個(gè)
START WITH 1 -- 從1開(kāi)始計(jì)數(shù)
NOMAXVALUE -- 不設(shè)置最大值
NOCYCLE -- 一直累加,不循環(huán)
CACHE 10;
一旦定義了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的當(dāng)前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
比如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL
可以使用sequence的地方:
- 不包含子查詢、snapshot、VIEW的 SELECT 語(yǔ)句
- INSERT語(yǔ)句的子查詢中
- NSERT語(yǔ)句的VALUES中
- UPDATE 的 SET中
可以看如下例子:
INSERT INTO emp VALUES
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
SELECT empseq.currval FROM DUAL;
但是要注意的是:
- 第一次NEXTVAL返回的是初始值;隨后的NEXTVAL會(huì)自動(dòng)增加你定義的INCREMENT BY值,然后返回增加后的值。CURRVAL 總是返回當(dāng)前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否則會(huì)出錯(cuò)。一次NEXTVAL會(huì)增加一次SEQUENCE的值,所以如果你在同一個(gè)語(yǔ)句里面使用多個(gè)NEXTVAL,其值就是不一樣的。明白?
- 如果指定CACHE值,ORACLE就可以預(yù)先在內(nèi)存里面放置一些sequence,這樣存取的快些。cache里面的取完后,oracle自動(dòng)再取一組到cache。 使用cache或許會(huì)跳號(hào), 比如數(shù)據(jù)庫(kù)突然不正常down掉(shutdown abort),cache中的sequence就會(huì)丟失. 所以可以在create sequence的時(shí)候用nocache防止這種情況。
2、Alter Sequence
你或者是該sequence的owner,或者有ALTER ANY SEQUENCE 權(quán)限才能改動(dòng)sequence. 可以alter除start至以外的所有sequence參數(shù).如果想要改變start值,必須 drop sequence 再 re-create .
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000后從頭開(kāi)始
NOCACHE ;
影響Sequence的初始化參數(shù):
SEQUENCE_CACHE_ENTRIES =設(shè)置能同時(shí)被cache的sequence數(shù)目。
可以很簡(jiǎn)單的Drop Sequence
DROP SEQUENCE order_seq;
好象它們兩者沒(méi)有依屬聯(lián)系,而確實(shí)在工作中又容易遇見(jiàn)此類問(wèn)題.
從序列的角度來(lái)思考的話,僅跟用戶相關(guān)。
以下步驟可以參考:
1 從系統(tǒng)視圖中取得所有序列的相關(guān)信息。
注意相關(guān)權(quán)限。
select sequence_name,min_value,max_value,increment_by,last_number from all_sequences
如果能夠能夠排除 用戶A的表數(shù)據(jù),采用了用戶B的sequence來(lái)生成數(shù)據(jù)的情況,那可以加上
where sequence_owner=' '; -----適合的用戶
或者從USER_SEQUENCES中提取。
2 從關(guān)心的表中提取敏感字段的最大值
select max(id) from test;
3 將兩者對(duì)比?;蛘邔⑸鲜鰞蓚€(gè)查詢連接到一起來(lái)查詢。如果當(dāng)前該表沒(méi)有被插入,并且,近期沒(méi)有被刪除,那么,該max(id)+1=last_number ;
如果非要弄清楚的話,那就將表數(shù)據(jù)保護(hù)起來(lái),拒絕刪除數(shù)據(jù),當(dāng)發(fā)現(xiàn)數(shù)據(jù)插入后,觀察插入的頻度和事務(wù)提交后序列列值變化的大小,由此最終能判斷出是哪個(gè)序列號(hào)?;诜且獪?zhǔn)確的搞清楚的前提下,使用排出法,將上述最接近的序列按照從輕度懷疑到高度懷疑的順序,再備份的情況下,依次刪除、恢復(fù).....這樣肯定能搞準(zhǔn)。
還有一個(gè)最好的辦法以后遇到這種情況就簡(jiǎn)單了。在該表上建立基于插入后的觸發(fā)器,在觸發(fā)器中包含上面查詢思想,將max(id)+1=last_number 的序列名返回。。。。則絕對(duì)不會(huì)錯(cuò)
.
知識(shí)有限,在此也期盼能學(xué)習(xí)到更高級(jí)的方法。
希望能幫到你。.
select Seq_Base_Wareclass.Nextval as NNN from dual
然后, 用DataReader讀出來(lái)
int nextVal = int.Parse(dataReader[0].toString());
直接 int.Parse("Seq_Base_Wareclass.Nextval ") 的話, “Seq_Base_Wareclass.Nextval” 這個(gè)字符串是不會(huì)轉(zhuǎn)成int的。