前段时间用的是select last_number-1 from user_sequences where sequence_name='序列名'.这个方法是有隐患的.在有大量并发访问做insert操作的时候可能会出现取错值的现象.今天查到一个新的方法.在insert后使用select 序列名.CURRVAL from dual也可以拿到数值.而且这个CURRVAL 只在insert后的操作对话中保留,也就是每个用户做了insert后他们看到的是不同的CURRVAL .不受其他用户影响,而且当你在当前操作中再做了一次insert后,CURRVAL 也随之刷新.现在就不存在取错数值的原因了.可以放心使用.
附上一个例子吧:
后台一个存储过程
create or replace procedure newArchfileID(INSERT_SQL varchar, SEQ_NAME varchar,newid out number) is
str_sql varchar(100);
begin
execute immediate INSERT_SQL ;
str_sql := 'select '||SEQ_NAME||'.CURRVAL from dual ' ;
execute immediate str_sql into newid;
end newArchfileID;
调用存储过程的c#代码:
string ConnectionString = "连接字符串";
OracleConnection conn = new OracleConnection(ConnectionString);//创建一个新连接
OracleCommand cmd = new OracleCommand("newArchfileID", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("INSERT_SQL", OracleType.VarChar);
cmd.Parameters.Add("SEQ_NAME ", OracleType.VarChar);
cmd.Parameters.Add("newid", OracleType.Number);
cmd.Parameters[0].Value = "具体的insert语句";
cmd.Parameters[1].Value = "序列名";
cmd.Parameters[2].Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
//输出新的id
fileid = cmd.Parameters["newid"].Value.ToString();
Response.Write(fileid);