sequence就是一個(gè)序列,你每次執(zhí)行 select CASE_SEQ.nextval from dual 的時(shí)候都會返回唯一的一個(gè)ID號,因此你可以先執(zhí)行這個(gè)select取到這個(gè)ID,如果這個(gè)時(shí)候有多個(gè)用戶在執(zhí)行這個(gè)操作,那么他們select到的ID絕對跟你的不一樣(sequence就是保證這一點(diǎn)的)。然后你就可以用這個(gè)ID插入記錄,然后再返回這個(gè)ID就OK了。
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),云巖網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:云巖等地區(qū)。云巖做網(wǎng)站價(jià)格咨詢:028-86922220
代碼:
string sql = "Select CASE_SEQ.currval from dual";
OracleConnection conn = DB.getCon();
OracleCommand cmd = conn.CreateCommand();
conn.Open();
string returnID = null;
cmd.CommandText = sql;
returnID = Convert.ToString(cmd.ExecuteScalar()); //獲取ID
sql = "insert into PATIENT_T(pid,name) values(returnID,'黎明')"; //將ID插入數(shù)據(jù)庫
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
conn.Close();
結(jié)束了,差不多就是這樣,樓主自己調(diào)試一下就行了,注意ID在數(shù)據(jù)庫中應(yīng)該是varcahr類型的
有兩種方法可以設(shè)置主鍵,一種是自增長主鍵,另一種就是生成唯一序列。
一、自增長主鍵
--首先建一個(gè)表TEST
create table TEST
(
NID int PRIMARY KEY,
test1 varchar2(20),
test2 varchar2(20),
test3 varchar2(20),
test4 varchar2(20),
test5 varchar2(20)
)
-- 再建一個(gè)序列SEQ_TEST
create sequence SEQ_TEST
minvalue 1 --最小值
nomaxvalue --不設(shè)置最大值
start with 1 --從1開始計(jì)數(shù)
increment by 1 --每次加1個(gè)
nocycle --一直累加,不循環(huán)
nocache; --不建緩沖區(qū)
以上代碼完成了一個(gè)序列(sequence)的建立過程,名稱為SEQ_TEST,范圍是從1開始到無限大(無限大的程度是由你機(jī)器決定的),nocycle 是決定不循環(huán),如果你設(shè)置了最大值那么你可以用cycle 會使seq到最大之后循環(huán).對于nocache順便說一下如果你給出了cache值那么系統(tǒng)將自動(dòng)讀取你的cache值大小個(gè)seq,這樣在反復(fù)操作時(shí)會加快運(yùn)行速度,但如果遭遇意外情況如當(dāng)機(jī)了或Oracle死了,則下次取出的seq值將和上次的不連貫.(如果連不連貫無所謂建議用cache,因?yàn)闀r(shí)間就是金錢呀!)
你只有了表和序列還不夠,最好再建一個(gè)觸發(fā)器來執(zhí)行它!代碼如下:
CREATE OR REPLACE TRIGGER tg_test
BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null)
begin
select seq_test.nextval into:new.nid from dual;
end;
下面是測試
select * from test
insert into test(nid,test1) values(6,'aaa')
insert into test(test1) values('bbb')
oracle 在sql中怎么獲取id
1、對于提交(最后一次操作commit了)的話可以查詢那個(gè)提交段
SELECT 列名1,列名2……
FROM 表名 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE where
VERSIONS_STARTTIME IS NOT null ORDER BY VERSIONS_STARTTIME DESC;
查出來的第一條就是最后改變的數(shù)據(jù)
2、如果表里面有序列或固定的排序字段可按倒排序后取第一條
where rownum2 order by 排序字段 desc
3、還有另外一種辦法就是利用ORACLE偽列rowid
select * from tbl t1 where t1.rowid=(select max(rowid) from tbl t2)
4、在redo log中找到對應(yīng)相關(guān)的表的插入語句,但是這樣找到的是sql語句,而不是數(shù)據(jù)。查redo log得使用log miner工具
一、主鍵id自增
oracle 中不能設(shè)置自動(dòng)增加,這個(gè)和其他數(shù)據(jù)庫不一樣,但是有 序列,這個(gè)是Oracle自己特有的東西,
1、首先創(chuàng)建序列:create sequence seq;
語法:
CREATE SEQUENCE 序列名
[INCREMENT BY n] --每次加幾
[START WITH n] --序列從幾開始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --小值、大值限制
比CREATE SEQUENCE seq start with 1 increment by 1; --建立了額從1開始每次加1序列
訪問序列時(shí)用 序列名稱.nextval語法
這就創(chuàng)建好了,然后 seq.nextval 就會返回一個(gè)值,不會重復(fù)的值,
insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');
這樣前3個(gè)id 分別是 1,2,3
查看當(dāng)前會話的session ID 有如下三種方法:
1. v$mystat視圖
SQL select sid from v$mystat where rownum=1;
SID
----------
1152
2. 使用userenv(‘sid’) 直接獲取
這種方法只能在oracle 10g以后可以使用。
SQL select userenv('sid') from dual;
USERENV('SID')
--------------
1152
3. 結(jié)合 userenv('sessionid') 與 v$session 視圖
userenv('sessionid') 返回的是session audit id.其對應(yīng)v$session 的audsid字段。
在session 連接到數(shù)據(jù)庫的時(shí)候,會從SYS.AUDSES$序列中獲取一個(gè)audid 分配給session。
SQL select sid from v$session where audsid=userenv('sessionid');
SID
----------
773
1152
--這里返回了2個(gè)值,直接查看userenv('sessionid') 值:
SQL select userenv('sessionid') from dual;
USERENV('SESSIONID')
--------------------
4294967295
對于internal用戶(’/as sysoper’ 和 ‘/as sysdba’)和后臺進(jìn)程,其對應(yīng)的AUDID 為0.
在Oracle 10g中,如果AUDID的值為0,表明是internal 用戶,如果AUDID 值是4294967295,那么就表明是用SYS 用戶直接連接的。
這里返回三個(gè)結(jié)果是把所有SYS 用戶的session都返回了,所以這種方法有時(shí)的準(zhǔn)確性并不高。
單純sql語句里面沒有這個(gè)語法。
plsql里面有這個(gè)方法,具體示例:
DECLARE
v_id t.id%TYPE;
BEGIN
INSERT INTO t
VALUES (t_seq.nextval, 'DDD')
RETURNING id INTO v_id;
COMMIT;
DBMS_OUTPUT.put_line('ID=' || v_id);
END;
/