在sql sever中实现插入数据的自动增长是很容易的,但是在oracle数据库中实现这一操作不是很容易,同时要想在.net中实现获取新插入数据的id,而 且不会出现读错的情况,就更显得困难了,为了解决在oracle数据中插入的数据能够自增id,同时获取新数据的id,并避免因并发操作而出现的id读错 的问题。

数据表结构为test(id,name)

首先,解决数据id自增问题

创建一个序列sequence(sequence详解可从网上搜一下,这里不赘述)

create sequence SEQ_test
minvalue 1
maxvalue 99999999999999999999999999
start with 21
increment by 1
cache 20;

序列sequence有两个固有属性nextval(下一个值)和currval(当前值)

这样在插入数据的sql语句中可以自动获取自增的id值:insert into test(id,name) values(seq_test.nextval,'name1')

插入完毕后,就可以获取该id值了:select seq_test.currval from
dual

注意:序列的currval属性只有在插入语句insert完毕后形成短暂记录,所以必须在下一次数据库操作之前获取该值,否则失效无法获得,为了解决这一问题,我们可以通过创建存储过程来及时获取该值。

然后,创建存储过程,实现插入和获值操作

为了实现该存储过程的可扩展性,存储过程的参数包括三个:strInsertSQL(传递insert语句),seqName(获取序列的名称),ID(输出值,获取id)

create or replace procedure p_GetItemID(
strInsertSQL  varchar2,
seqName  varchar2,
ID out varchar2
)
is

strSql varchar(200);
begin
      execute immediate strInsertSQL;--执行插入语句
      strSql:='select '||seqName||'.currval from dual';--获取id的sql语句
      execute immediate strSql into ID;--执行获取id的sql语句

EXCEPTION
       WHEN OTHERS THEN
       DBMS_output.PUT_LINE(SQLERRM);

end p_GetItemID;

最后,利用c#语言,在实现.net中实现程序应用

同样为了实现该功能的扩展行,创建获取id的函数,数据库连接语句从webconfig中获取

public string ExecuteProcedure(string strInsertSQL,string proName,string seqName)
    {
        try
        {
            if (m_Connection_orc.State != System.Data.ConnectionState.Open)
            {//从webconfig中获取数据库连接
                m_Connection_orc.Open();
            }
        }
        catch (System.Exception ex)
        {
        }
        try
        {     //蓝色字体会核心语句       
            OracleConnection dbConnection_orc;
            OracleCommand dbCommand_orc;
            dbConnection_orc = m_Connection_orc;
            dbCommand_orc = new OracleCommand(proName, dbConnection_orc); 
//proName为存储过程的名字

dbCommand_orc.CommandType = CommandType.StoredProcedure;

//在Parameters中添加的参数名称必须与数据库中存储过程中的参数名称、类型保持一致

dbCommand_orc.Parameters.Add("strInsertSQL", OracleType.VarChar);
            dbCommand_orc.Parameters.Add("seqName", OracleType.VarChar);
            dbCommand_orc.Parameters.Add("ID", OracleType.VarChar);

dbCommand_orc.Parameters["ID"].Direction = ParameterDirection.Output; //指定参数ID为输出类型的值
            dbCommand_orc.Parameters["strInsertSQL"].Value = strInsertSQL;  //获取插入语句
            dbCommand_orc.Parameters["seqName"].Value = seqName;  //获取序列名称

dbCommand_orc.ExecuteNonQuery(); //执行操作

string newID = dbCommand_orc.Parameters["ID"].Value.ToString();  //获取id的值
            return newID;        //返回id值
        }
        catch (System.Exception ex)
        {
            throw ex;
        }
        finally
        {
            CloseConnection();
        }
    }

至此,获取新插入数据的id值操作就结束了,在编程过程中,调用函数ExecuteProcedure就可以获取id值,哇咔咔

[转]http://blog.csdn.net/whx_1113/article/details/8649538

获得Oracle中刚插入的数据的ID(for produce)的更多相关文章

  1. C#获取刚插入的数据的id

    在开发程序中我们经常会遇到两个表或多个表关联同时插入数据的需求. 那么我们刚给主表插入一条数据,接着给副表插入数据时其中一个字段要存储与主表关联的id,那么我们该怎么获取刚插入的那条数据的id呢?   ...

  2. C#利用ODP.NET往oracle中高效插入百万数据

    由于工作的原因,要使用winform来处理大量的数据,但是c#自带的System.data.OracleClient效率不是很高,在网上找了很久,找到了ODP.NET,是oracle为c#提供的.貌似 ...

  3. Mysql 中获取刚插入的自增长id的值

    insert into user (username,password) VALUES ('); //获取刚插入的自增长id的值 select last_insert_id(); 在MySQL中,使用 ...

  4. Oracle中批量插入

    为了防止OracleConnection的重复打开和关闭,使用begin end:将sql语句包在里面,然后一次性执行提高插入的效率. 下面代码中要插入的数据在list集合中,如果list集合的cou ...

  5. Oracle中如何插入特殊字符: & 和 ' (多种解决方案)

    Oracle中如何插入特殊字符:& 和 ' (多种解决方案)今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Inse ...

  6. Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

    应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

  7. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)

    今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Insert语句,怎么会有自定义变量呢?后来搜索了一下关键字AMP发现,原来 ...

  8. Oracle中如何插入特殊字符:& 和 ' (多种解决方案)-转载

    文章出处:http://blog.sina.com.cn/s/blog_5f39af320101gb3f.html 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量A ...

  9. oracle中字符串与表数据拼接的用法--“||”

    测试过程中,经常需要批量删除或者插入.修改一些表数据或结构,使用手工复制.粘贴其实很麻烦,所以这是我们就可以使用拼接成sql语句的方法来实现操作数据.下面先讲讲oracle中拼接符 || 的用法,如下 ...

随机推荐

  1. uboot无法引导uImage错误及其解决方法

    先编译友善提供的linux内核: make ARCH=arm mini2440_defconfigmake CROSS_COMPILE=arm-linux- uImage 在arch/arm/boot ...

  2. Centos6.5下ElasticSearch1.4.4的安装

    1.下载ElasticSearch 官网地址 https://www.elastic.co/ 2.安装elasticsearch-1.4.4.tar.gz tar -zxvf elasticsearc ...

  3. 【P1582】倒水(数论??暴力!!)

    这个题我很无语,一开始看绿题,还是数论,应该不会特别简单,应该要动笔写上好一会,过了一会旁边 #祝神 说这原来是个蓝题,我顿时觉得十分迷茫... 结果看了这个题看了一会,仔细一想,woc,这题怕不是可 ...

  4. Spring初学之spring的事务管理xml

    所有的java类都是用的上一篇文章:Spring初学之spring的事务管理 不同的是,这时xml配置事务,所以就要把java类中的那些关于spring的注解都删掉,然后在xml中配置,Applica ...

  5. 用SQL语句删除除了id不同,其他都相同的学生表信息

    delete from <table_name> wehere id not in (select max(id) from <table_name> group by < ...

  6. Python staticmethod

    1 @staticmethod 静态方法 when this method is called, we don't pass an instance of the class to it (as we ...

  7. Angular中文api

    Angular中文api:http://docs.ngnice.com/api

  8. java笔试面试(转载)

    Java面试笔试题大汇总(最全+详细答案) 2016-02-01 15:23 13480人阅读 评论(8) 收藏 举报  分类: Java面试题(1)  声明:有人说, 有些面试题很变态,个人认为其实 ...

  9. Redis源码分析:serverCron - redis源码笔记

    [redis源码分析]http://blog.csdn.net/column/details/redis-source.html   Redis源代码重要目录 dict.c:也是很重要的两个文件,主要 ...

  10. 从性能的角度谈SQL Server聚集索引键的选择

      简介 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是按照聚集索引的列作为关键字进行了.因此对于聚集索引的选择对性能的影响就变得十分重要 ...