字体:  

Oracle11g之实用技术--将数据插入Oracle数据库时如何得到其rowId

土著 发表于: 2008-9-24 15:57 来源: 北博

转自花纯春的博客:
   
看了很多提及Oracle11g特性的文章,可能大家对于使用已经并不陌生了,但其实关于rowID还是有不少学问的,像通过它可以很快的访问表中的一行,借助其提供的dbms_rowid进行解析从而获取关于行的相关信息等等。下面是看到的一篇有关数据插入时rowID的得到,过程还是比较清晰的,与大家分享。


Oracle11g有诸多的新特性,相信各位已经从很多渠道了解到了,在此,我重点介绍一下如何在Oracle11g中插入数据时得到RowId,并公布一下,才发现的小秘密。

在有些应用场景下,我们需要在将数据插入到数据库时,返回rowId。Oracle有一条返回语句。其语法如下:


INSERT INTO <table_name>
(column_list)
VALUES
(values_list)
RETURNING <value_name>
INTO <variable_name>;

但在插入数据后,如何得到rowId呢?
在JDBC中,可以使用Callback语句去执行Procedure,因此,我们可以从连接对象产生Callback语句,并执行插入命令的SQL脚本,这样以从对象得到返回值。这个关键是如何写这条插入语句?并且如何去调用语句以及如何得到返回值。





以下是我的测试代码。

创建测试数据库

创建一个表FI_T_USER,这个表包含2字段,第一个是主键USER_ID,另一个是USER_NAME。创建语句如下:

create table FI_T_USER(
    USER_ID varchar2(20) primary key,
    USER_NAME varchar2(100)
);

写测试代码

以下是我的测试代码:














这里面很重要的代码是指定插入SQL脚本这句:

String insertSQL = "begin insert into FI_T_USER(USER_ID, USER_NAME) values(?,?) return rowid into ?;end;";

接下来的关键是,注册输出参数,并在执行语句后得到这个参数。

这些代码非常有用,不仅能在Oracle11g上使用,还可支持Oracle10和Oracle 9.2。


好了,本文开头所述,我发现的这个Oracle11g的秘密就是:
Oracle11g能在将数据导出备份时压缩数据,并且效率惊人。据Oracle11g白皮书中介绍,压缩率可达到74.67% , 本文主要介绍的是在Oracle11g中的实用技巧—插入数据时取得RowId,至于压缩嘛,就下次有机会再写了。

详细内容请看:http://wmdata.com.cn/oracle/11g/index.asp?froms=bbs

最新回复

sfpwuu at 2008-9-24 16:12:31
rowId涉及到了rfile#,所以我想简要补充一下rfile# 和 file#的区别:file#是数据文件的绝对文件号,是数据文件在数据库中的唯一标示;对应着dba_data_files.file_id以及v$datafile.file#,数据库中每增加一个datafile,系统都会为其分配一个file_id,系统优先使用当前最大值以下的空闲值
兲苼氣質 at 2008-9-24 16:32:06
数据库同时能打开的最大数据文件数是受到参数db_files的限制,default值是200,超过default值以后再增加数据文件会得到错误。另外,需要注意的是db_files,oracle不建议把db_files设的太大,因为db_files越大消耗sga中的mem就越多。
jishuren at 2008-9-24 18:14:30
搞Oracle都会经常碰到rowId,rowId其实就是唯一标志记录物理位置的一个id。在Oracle 8版本以前,rowId由file#+block#+row#组成,占用6个bytes空间,10 bit 的 file# ,22bit 的 block# ,16 bit 的 row#
心随我动 at 2008-9-25 10:23:25
Oracle 11g的Oracle Data Guard组件可用于对生产数据库的报告、备份、测试和“滚动”升级
绿野仙踪 at 2008-9-25 10:46:18
从甲骨文此次推出的11g可以看到,在安全方面除了10g已经存在的数据阀门和加密外,11g又增加了四项安全功能,即安全备份、非对称数据的授权安全检索、监控、管理和报警 我是比较喜欢的 呵呵
土著 at 2008-9-25 13:11:41
我想提醒大家一点,我自己在建表table时使用了sys用户,因此table存放在了system 表空间中了,这个习惯很不好。所以大家在操作的时候,最好使用其他用户,而且不要把对象轻易的放在system表空间中,以免给system tables中造成过多的碎片
sfpwuu at 2008-9-25 14:14:43
Oracle 11g数据库还增强了Oracle透明数据加密功能,并将这种功能扩展到了卷级加密之外
来自山里 at 2008-9-25 16:39:21
什么时候出现这么多高手了~?
feng0819 at 2008-9-25 19:15:14
高手无处不再~~~

人才济济了