壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5197|回复: 12

问大家个Oracle Form更新数据问题

[复制链接]
发表于 2007/7/6 12:41:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
如图所示FORM:其中Dept_id是主键字段,允许在界面上更新。
11.jpg
以图中第一条记录为例:我现在想把Dept_id修改成20
更新语句我是这样写的
Update DEPT
SET  Dept_id        = :DEPT.Dept_id ,
        Dept_Num   = :DEPT.Dept_Num ,
        Dept_Name  = :DEPT.Dept_Name ,
        Dept_Text    = :DEPT.Dept_Text
WHERE  Dept_id   = :DEPT.Dept_id ;
结果就会出现这样的问题,Oracle无法在数据库中找到Dept_id为20的记录,无法完成更新。究其原因是此例丢失了Dept_id 的Old Value 2,仅仅保留了New Value 20.
当然,通过Rowid可以唯一的定义一条记录,假使此处不用Rowid,该用何种方法实现这样的更新呢?我查查资料,有人说Oracle Form是支持这样Old,New模式的,但不知具体怎么实现,各位帮我支支招。
发表于 2007/7/6 13:12:57 | 显示全部楼层
bhbb2000 作form很多
找他
呵呵
我还没学会呢
发表于 2007/7/6 13:36:01 | 显示全部楼层
ORACLE标准功能是不限制主键和外键的,那样可以更新,在这里Dept_id是主键,如果你更新主键,结果就会是找不到这条记录,所以你不能做这样的操作。
实现这个目的可以用别的方法,判断当主键项发生变更时,删除原纪录,再增加一条新记录,这样就没问题。
 楼主| 发表于 2007/7/6 13:57:03 | 显示全部楼层
原帖由 bhbb2000 于 2007-7-6 13:36 发表
实现这个目的可以用别的方法,判断当主键项发生变更时,删除 ...

如果我不想删除呢?
我知道至少有两种方法可以实现这种操作
1利用rowid定位记录;
2在块上加个非数据库字段,记录初始值
以前做C#开发时,系统是支持这种模式的,我想Oracle  Form在这方面也应该会给出好的解决方案,只是我们不知道而已.
发表于 2007/7/6 14:26:19 | 显示全部楼层
这里的前提是你已经把dept_id定义为主键了,主键是不能被更新的,所以我排除了使用update来解决这个问题途径。
 楼主| 发表于 2007/7/6 16:02:29 | 显示全部楼层
原帖由 bhbb2000 于 2007-7-6 14:26 发表
这里的前提是你已经把dept_id定义为主键了,主键是不能被更新的,所以我排除了使用update来解决这个问题途径。

主键的确不应该被更新,但不意味着不能被更新。比如一张表记录了学生选课的信息,联合主键字段为学号和课程号,那么我在界面上修改一个学生的选课信息不是必然要修改主键吗???
发表于 2007/7/6 16:15:53 | 显示全部楼层
我的意思是说你有没有在基表层限定这个dept_id为primary_key(PK),如果你没有这么做,当然可以UPDATE,如果基表限定了这个列为PK或者你在FORM中指定了这个项是数据源视图的主键,那么数据库是不允许你这么做的
 楼主| 发表于 2007/7/6 16:54:57 | 显示全部楼层
原帖由 bhbb2000 于 2007-7-6 16:15 发表
我的意思是说你有没有在基表层限定这个dept_id为primary_key(PK),如果你没有这么做,当然可以UPDATE,如果基表限定了这个列为PK或者你在FORM中指定了这个项是数据源视图的主键,那么数据库是不允许你这么做的

按照你的说法,在数据库和Oracle Form中都指定了主键,照样更新,无任何限制.
create table DEPT
(
  DEPT_ID   NUMBER not null,
  DEPT_NAME VARCHAR2(30),
  DEPT_TEXT VARCHAR2(300),
  DEPT_NUM  NUMBER
);
   -- Create/Recreate primary, unique and foreign key constraints
alter table DEPT
  add constraint DEPT_PK primary key (DEPT_ID) ;
CREATE OR REPLACE VIEW DEPT_V AS
SELECT
     DEPT_ID
    ,DEPT_NAME
    ,DEPT_TEXT
    ,DEPT_NUM
FROM DEPT
你可以试下 .

DEPT.rar

29.89 KB, 下载次数: 16, 下载积分: 努力值 -5 点

DEPT.FMB

发表于 2007/7/9 18:21:41 | 显示全部楼层
非常抱歉,我一直疏忽了去测试这个情况。这个问题我以前问过一些高级顾问,他们直接告诉我,所以就没在意。这次我自己做了一个测试,但是FORM6i是可以做主码更新的阿,我把一个字段在数据库层设置成主码,不管我把数据块的数据源设置成表还是视图,都可以更新这个主码
 楼主| 发表于 2007/7/9 18:51:06 | 显示全部楼层
多谢Phoenix,我测试下来也是这个结果.另外 我trace了这个Form,发现oracle本身是通过rowid去更新数据的。
发表于 2007/7/10 22:17:16 | 显示全部楼层
都是牛人..................
发表于 2007/8/4 08:00:16 | 显示全部楼层
学习............
发表于 2010/5/5 10:40:42 | 显示全部楼层
如何实现更新操作呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 23:01 , Processed in 0.022427 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表