获得Oracle中刚插入的数据的ID(for produce)
在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)的更多相关文章
- C#获取刚插入的数据的id
在开发程序中我们经常会遇到两个表或多个表关联同时插入数据的需求. 那么我们刚给主表插入一条数据,接着给副表插入数据时其中一个字段要存储与主表关联的id,那么我们该怎么获取刚插入的那条数据的id呢? ...
- C#利用ODP.NET往oracle中高效插入百万数据
由于工作的原因,要使用winform来处理大量的数据,但是c#自带的System.data.OracleClient效率不是很高,在网上找了很久,找到了ODP.NET,是oracle为c#提供的.貌似 ...
- Mysql 中获取刚插入的自增长id的值
insert into user (username,password) VALUES ('); //获取刚插入的自增长id的值 select last_insert_id(); 在MySQL中,使用 ...
- Oracle中批量插入
为了防止OracleConnection的重复打开和关闭,使用begin end:将sql语句包在里面,然后一次性执行提高插入的效率. 下面代码中要插入的数据在list集合中,如果list集合的cou ...
- Oracle中如何插入特殊字符: & 和 ' (多种解决方案)
Oracle中如何插入特殊字符:& 和 ' (多种解决方案)今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Inse ...
- Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)
应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...
- Oracle中如何插入特殊字符:& 和 ' (多种解决方案)
今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Insert语句,怎么会有自定义变量呢?后来搜索了一下关键字AMP发现,原来 ...
- Oracle中如何插入特殊字符:& 和 ' (多种解决方案)-转载
文章出处:http://blog.sina.com.cn/s/blog_5f39af320101gb3f.html 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自定义变量A ...
- oracle中字符串与表数据拼接的用法--“||”
测试过程中,经常需要批量删除或者插入.修改一些表数据或结构,使用手工复制.粘贴其实很麻烦,所以这是我们就可以使用拼接成sql语句的方法来实现操作数据.下面先讲讲oracle中拼接符 || 的用法,如下 ...
随机推荐
- INSPIRED启示录 读书笔记 - 第9章 产品副经理
发现帮手 从本质上讲,产品就是创意,产品经理的职责是想出好点并加以实现.我们需要好点子,有些想法是我们自己的创意,但如果仅依靠自己,就会严重限制创意的发挥 做产品要找公司最聪明的人合作,发现公司里潜在 ...
- JSP DAO(Model)
示例代码: 1. Users类 package com.po; public class Users { private String username; private String passwor ...
- SQLite3时间函数小结
import sqlite3 conn = sqlite3.connect('/tmp/sqlite.db') cur = conn.cursor() 接下来干嘛呢?建一张表吧.这里需要注意的是,SQ ...
- Whitewidow:SQL 漏洞自动扫描工具
Whitewidow 是一个开源的 SQL 漏洞自动扫描器,可用通过文件列表运行,或者从 Google 爬取并发现有潜在漏洞的网站. 这个工具支持自动格式化文件.随机用户代理.IP 地址.服务器信息. ...
- ubuntu 的mysql 安装过程和无法远程的解决方案
ubuntu 的mysql 安装过程和无法远程的解决方案 安装完mysql-server启动mysqlroot@ubuntu:# /etc/init.d/mysql start (如果这个命令不可以, ...
- 16个tomcat面试题
1)解释什么是Jasper? Jasper是Tomcat的JSP引擎 它解析JSP文件,将它们编译成JAVA代码作为servlet 在运行时,Jasper允许自动检测JSP文件的更改并重新编译它们 2 ...
- ssm搭建相关的问题
在搭建ssm框架时候踩得坑:1.对于拦截器url-parttern的设置:第一次设置的是/** 本以为这个是表示拦截所有,没想到这是错误的写法,正确的写法是/ 启动项目不会报错,但是会出现404 ...
- YARN中的失败分析
YARN中的失败分析 对于在YARN中运行的MapReduce程序,需要考虑以下几种实体的失败任务.application master.节点管理器.资源管理器 1. 任务运行失败 任务运行失败类似于 ...
- HDFS存档
Hadoop存档 每个文件均按块方式存储,每个块的元数据存储在namenode的内存中,因此Hadoop存储小文件会非常低效.因为大量的小文件会耗尽namenode中的大部分内存.存储小文件所需的磁盘 ...
- STL视频_02
[01:05]主要讲一下几个要点: 1.模板.函数模板 类模板 以及它们的用法 2.容器.什么是容器 和 容器的分类,各种容器的数据结构 3.容器vector的具体用法,包括迭代器的具体用法 [01: ...