小春网

 找回密码
 注册账号
12
返回列表 发新帖
楼主: bjbj
收起左侧

[IT 交流] 一个关于oracle数据更新的问题

[复制链接]
 楼主| 发表于 2009-1-20 11:42:29 | 显示全部楼层
原帖由 小剛 于 2009-1-19 17:09 发表
oracle里面,有专用的排他用法

for update wait 和nowait

你去查查,不知道你说的是不是这个东西


虽然不是我想要的东西,还是谢谢小剛

我想知道的是,oracle一个事务里面同一数据的重复更新顺序。
好比说 原始数据A   ->  1次更新数据B  -> 2次更新数据C  -> 最终数据D
最后更新结果是D这个没问题, 想知道的是
1) 从 1次更新数据B 到 2次更新数据C 的更新过程当中, 1次更新数据B的抽出方式
2) 同一事务重复更新时,oracle的更新日志纪录是几件,都是什么操作的纪录:)

ご存知してると,教えてね:)
回复

使用道具 举报

发表于 2009-1-21 00:47:28 | 显示全部楼层
你说的处理过程的条件和前提不够清楚。

1.你说的处理是不是用程序来控制的?第一次处理和第二次处理是不是在同一程序中处理
  的?在同一程序中处理的话第二次处理的对象数据就不是抽取,一般我们把这个处理结
  果放在一个变量中反复处理直到一连串的处理完毕。你说的是同一事务的话我想应
  该是这么处理的。比如说第一次处理的结果放在变量X中,第二次处理的时候就把X再拿
  出来处理,再把结果代入变量X,第三次,四次也是如此。

2.有没有记录,要看说的这些数据是什么样的构成?数据库中有好几种情况。
1)是改变同一张表中的同一个数据。比如说改变zhou的bonus。
   此时oracle的更新日志要看标准功能有没有一张表来记录,或是你自己
   有没有弄一个表来记录更新情况。

   table salary(第一次处理后的结果)
      name      salary   bonus  update                        employee_ID  salary_id
      yamata    2000    100       2009/1/1 19'00         1234                 1
      zhou        1980    90         2009/1/2  18'09         1235                 2

2)是生成新的数据

   table salary(第一次处理后的结果)
      name      salary   bonus  update                          employee_ID  
         yamata        2000    100       2009/1/1   19'00          1234                  
             zhou        1980     89         2009/1/1   19'01          1235                  
             zhou        1980     90         2009/1/2   18'09          1235                  
  
这个表和上表不同的地方是追加了第一次变更的结果而保留变更前的数据。
这时候的抽取通常是根据employee_id和update来实现的。此时,我们就不需要通过其他表来查看更新记录了。什么操作,谁操作的,都可以通过追加表上的列来记录。

要回答你的问题牵涉到好几个前提,要说明得打老多字了。。。
回复

使用道具 举报

 楼主| 发表于 2009-1-21 12:00:57 | 显示全部楼层
〉〉[quote]原帖由 deepsea07 于 2009-1-21 00:47 发表
〉〉你说的处理过程的条件和前提不够清楚。
。。。。

谢谢兄台指点

确实要说明白,需要点详细说明。

当前我不是想要说怎么实现数据的更新,重点关心的是数据库的内部处理是怎么回事。

对于你说说的第一点,一般是这么处理(一次抽取,多次更新)。
可是我们现在考虑的是要在重复更新的过程中,抽取出每次更新时点的更新前状态和更新后状态。
更新后状态,其实是我们更新的内容,这个好理解。就是更新前的状态怎么提取才好?
(这里需要说明,不是说用暂时的数据来保存,是想在缓存当中去抽取)

对于第2点, 兄台说的是自己追加表来管理更新纪录,可行但是现在我们没有考虑这一点。
我们想看看直接在oracle的管理之下,能不能获取出oracle的更新纪录。

归结起来说,我看还是优先解决怎么提取更新前数据状态的问题好了:)
不管怎么样,谢谢了

[ 本帖最后由 bjbj 于 2009-1-21 12:04 编辑 ]
回复

使用道具 举报

发表于 2009-1-21 13:05:29 | 显示全部楼层
1.当前最新状态,每次更新的同时你可以加入系统的更新时间或一个序列号,下次要处理最近的数据时按最新时间或序列号进行提取。

2.oracle的管理?不知道你说的是数据库还是它的EBS,JD Edwards Etc.
EBS的管理,得看是哪个模块哪个功能哪张表。不同功能不同的表对更新的处理是不一样的,无法一概而论。这个有技术文档,自己可以查。

建议你先把oracle的数据库的基本原理弄清楚,这是大前提啊。看看silver的教材就基本上没问题了。具体到用哪个软件中有没有这个功能,那得自己调查。

其实你打开那张表看看表的column和里面的数据变化规律不就明白一大半了么。EBS里的标准表,一般有个叫update_date的column,如果每次更新这个column都更新的话,用unique key加max(update_date)就可以采取最新数据了。

[ 本帖最后由 deepsea07 于 2009-1-21 13:12 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-1-21 14:33:15 | 显示全部楼层
谢谢 deepsea07 的详细解释。:P

我确实对oracle的基本原理不是很了解,所以才会有这个疑问
上面说到的oracle的管理,我就是想说不借助任何工具的情况下,数据库本身是怎么样管理的。

要说sliver那本书,回头找来看看。
关于EBS, JD Edwards etc工具相关的话,这个好像需要基础知识,呵呵,目前还没涉及过,有时间也找来看看。

简单说来,看了兄台的说明,大致得出下面的结论,不知道对不对:
  要提取一个事务当中对一条数据的多次更新时的更新纪录,必须要借助更新时的数据列来实现。
  原来我认为,数据更新时会不会自动追加管理用数据列(例如更新时间,更新版本),现在看来可能没有。
  因此,在我们的程序当中,必须人为的追加列来实现版本的管理。

最后,小声说一下,我还只是个应用开发的新手,对数据库管理相关的底层原理还不是很了解
关于数据库后台处理和事务都相关的知识,要是兄台能给个链接的话,那就更好了。。。:P

[ 本帖最后由 bjbj 于 2009-1-21 14:37 编辑 ]
回复

使用道具 举报

发表于 2009-1-21 16:15:21 | 显示全部楼层
你在google上找ITpub,上面有很多资料。
不过我的建议是没有基础买两本书来看是最省时间的做法。书上写的系统且详细。
想想看你在网上搜寻花的时间,用去打工就可以买好几本了,呵呵。
开发的学数据库很有必要,顺便把oracle的silver给过了,给履历履历书上稍微增添一些光彩
回复

使用道具 举报

发表于 2009-1-21 16:28:11 | 显示全部楼层
原帖由 bjbj 于 2009-1-21 14:33 发表
简单说来,看了兄台的说明,大致得出下面的结论,不知道对不对:
  要提取一个事务当中对一条数据的多次更新时的更新纪录,必须要借助更新时的数据列来实现。
  原来我认为,数据更新时会不会自动追加管理用数据列(例如更新时间,更新版本),现在看来可能没有。
  因此,在我们的程序当中,必须人为的追加列来实现版本的管理。


要分清楚,oracle数据库没有这种功能,是通过业务软件来实现的。
而业务软件中的标准的表,大部分都可以在更新时自动更新管理用数据列。

但是,这个自动,是标准功能。编写customize的程序的时候,不去更新的话日期还是老样子。

我觉得你问的问题的时候没有一定基础,别人不知道你的目的,你也无法精确地描绘自己的需求,费了一番周折后就算得到正确回答也是理解不深的。
还是去好好看书吧。

下面这个图给你做个参考。我在里面学到了不少提问的知识

[ 本帖最后由 deepsea07 于 2009-1-21 16:29 编辑 ]
65_587854_1168313688.jpg
回复

使用道具 举报

发表于 2009-1-24 17:22:57 | 显示全部楼层
1,可以考虑用临时表
2,可以研究一下savepoint的用法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小春网
常务客服微信
微信订阅号
手机客户端
扫一扫,查看更方便! 快速回复 返回顶部 返回列表