ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle数据库管理 » update时行迁移到问题。

标题: update时行迁移到问题。
离线 likaiabc
中级会员


精华贴数 0
个人空间 0
技术积分 1081 (1667)
社区积分 706 (1152)
注册日期 2006-11-2
论坛徽章:6
授权会员生肖徽章2007版:猪2008年新春纪念徽章生肖徽章2007版:鼠ITPUB新首页上线纪念徽章数据库板块每日发贴之星
      

发表于 2008-7-4 12:27 
update时行迁移到问题。

http://www.itpub.net/viewthread.php?tid=225560&page=1
看了前辈的行链接和行迁移到的文章,有几个疑问


1、insert时如果block容不下行,则进行行链接。
那么假如在另外一个block里可以完全容下,会不会行链接变成行迁移呢?

2、update时发生的行迁移,假如任何block都容不下一个row,那么应该发生行链接吧?

请高人解疑惑!
thanks

[ 本帖最后由 likaiabc 于 2008-7-4 12:35 编辑 ]


__________________
只看该作者    顶部
离线 likaiabc
中级会员


精华贴数 0
个人空间 0
技术积分 1081 (1667)
社区积分 706 (1152)
注册日期 2006-11-2
论坛徽章:6
授权会员生肖徽章2007版:猪2008年新春纪念徽章生肖徽章2007版:鼠ITPUB新首页上线纪念徽章数据库板块每日发贴之星
      

发表于 2008-7-4 14:54 
顶一下,顺便还有一个问题,

为什么下面两个update都报
ORA-01401: inserted value too large for column
PHP code:


create table c11 
i1 varchar2(2));

insert into c11 values '1');

update c11 set i1 lpad(i1,10,'22'); 





create table c12 i1 varchar2(1000) );

insert into c12 values '1');

update c12

set 

i1 
lpad(i1,5003,'0');

而这个update却不报错误呢
PHP code:


create table c10 
i1 varchar2(4000),i2 varchar2(4000),i3 varchar2(4000),i4 varchar2(4000),i5 varchar2(4000) );

insert into c10 values '1','2','3','4','5');

update c10

set 

i1 
lpad(i1,5003,'0'),

i2 lpad(i2,5003,'0'),

i3 lpad(i3,5003,'0'),

i4 lpad(i4,5003,'0'),

i5 lpad(i5,5003,'0');

会不会是因为行链接造成的呢?


__________________
只看该作者    顶部
在线/呼叫 suniori
高级会员


精华贴数 0
个人空间 0
技术积分 4855 (276)
社区积分 2683 (472)
注册日期 2002-9-29
论坛徽章:17
ITPUB元老会员2007贡献徽章会员2006贡献徽章授权会员数据库板块每日发贴之星2008北京奥运纪念徽章:自行车
数据库板块每日发贴之星2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:皮划艇静水2008北京奥运纪念徽章:羽毛球数据库板块每日发贴之星2008北京奥运纪念徽章:水球

发表于 2008-7-4 14:55 
可以做迁移,构造合适的BLOCK ,尽量避免以上问题


__________________






只看该作者    顶部
离线 likaiabc
中级会员


精华贴数 0
个人空间 0
技术积分 1081 (1667)
社区积分 706 (1152)
注册日期 2006-11-2
论坛徽章:6
授权会员生肖徽章2007版:猪2008年新春纪念徽章生肖徽章2007版:鼠ITPUB新首页上线纪念徽章数据库板块每日发贴之星
      

发表于 2008-7-4 14:59 
那第二个帖子的问题呢?


__________________
只看该作者    顶部
在线/呼叫 suniori
高级会员


精华贴数 0
个人空间 0
技术积分 4855 (276)
社区积分 2683 (472)
注册日期 2002-9-29
论坛徽章:17
ITPUB元老会员2007贡献徽章会员2006贡献徽章授权会员数据库板块每日发贴之星2008北京奥运纪念徽章:自行车
数据库板块每日发贴之星2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:皮划艇静水2008北京奥运纪念徽章:羽毛球数据库板块每日发贴之星2008北京奥运纪念徽章:水球

发表于 2008-7-4 15:01 


QUOTE:
原帖由 likaiabc 于 2008-7-4 14:59 发表
那第二个帖子的问题呢?

已经回答了呀


__________________






只看该作者    顶部
离线 mengxb001
高级会员



精华贴数 0
个人空间 0
技术积分 2196 (722)
社区积分 49 (4935)
注册日期 2005-12-21
论坛徽章:9
生肖徽章2007版:鼠     
      

发表于 2008-7-4 15:02 
肯定发生行链接的


只看该作者    顶部
离线 likaiabc
中级会员


精华贴数 0
个人空间 0
技术积分 1081 (1667)
社区积分 706 (1152)
注册日期 2006-11-2
论坛徽章:6
授权会员生肖徽章2007版:猪2008年新春纪念徽章生肖徽章2007版:鼠ITPUB新首页上线纪念徽章数据库板块每日发贴之星
      

发表于 2008-7-4 15:25 


QUOTE:
原帖由 suniori 于 2008-7-4 15:01 发表

已经回答了呀



QUOTE:
构造合适的BLOCK ,尽量避免以上问题

是这句么?
因为block是固定的,所以构造合适的block应该没有意义。
我想发生行链接是不可避免的。

但是为什么我在二楼的问题,会出现那种多个大字段更新超过column的最大值,而没有出现错误呢?
我想知道原因,是不是行链接后就不出现了?


__________________
只看该作者    顶部
在线/呼叫 suniori
高级会员


精华贴数 0
个人空间 0
技术积分 4855 (276)
社区积分 2683 (472)
注册日期 2002-9-29
论坛徽章:17
ITPUB元老会员2007贡献徽章会员2006贡献徽章授权会员数据库板块每日发贴之星2008北京奥运纪念徽章:自行车
数据库板块每日发贴之星2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:皮划艇静水2008北京奥运纪念徽章:羽毛球数据库板块每日发贴之星2008北京奥运纪念徽章:水球

发表于 2008-7-4 15:29 
ORACLE 没有测试过,我曾经在INFORMIX 中碰到过类似的问题,INFORMIX 会截位的,超过了的就不进数据库了, 不知道ORACLE 存在这个BUG不


__________________






只看该作者    顶部
离线 zjuzsf
初级会员



精华贴数 0
个人空间 0
技术积分 117 (14637)
社区积分 0 (102807)
注册日期 2003-12-20
论坛徽章:0
      
      

发表于 2008-7-4 15:50 
表里面varchar2列最大是 4000
在sql里面计算结果超过 4000的自动截断为4000所以
update c10
set
i1 = lpad(i1,5003,'0'),
i2 = lpad(i2,5003,'0'),
i3 = lpad(i3,5003,'0'),

这个更新不会报错
lpad(i3,5003,'0'), 在sql里面实际上返回的是4000字节
SYSTEM@ora43>select length(lpad('0',5003,'0')) from dual;

LENGTH(LPAD('0',5003,'0'))
--------------------------
                      4000

QUOTE:
原帖由 likaiabc 于 2008-7-4 14:54 发表
顶一下,顺便还有一个问题,

为什么下面两个update都报
ORA-01401: inserted value too large for column
PHP code:


create table c11 
i1 varchar2(2));

insert into c11 values '1');

update c11 set i1 lpad(i1,10,'22'); 





create table c12 i1 varchar2(1000) );

insert into c12 values '1');

update c12

set 

i1 
lpad(i1,5003,'0');

而这个update却不报错误呢
PHP code:


create table c10 
i1 varchar2(4000),i2 varchar2(4000),i3 varchar2(4000),i4 varchar2(4000),i5 varchar2(4000) );

insert into c10 values '1','2','3','4','5');

update c10

set 

i1 
lpad(i1,5003,'0'),

i2 lpad(i2,5003,'0'),

i3 lpad(i3,5003,'0'),

i4 lpad(i4,5003,'0'),

i5 lpad(i5,5003,'0');

会不会是因为行链接造成的呢?




__________________
Oracle fans
PostgreSQL backend source code
只看该作者    顶部
离线 likaiabc
中级会员


精华贴数 0
个人空间 0
技术积分 1081 (1667)
社区积分 706 (1152)
注册日期 2006-11-2
论坛徽章:6
授权会员生肖徽章2007版:猪2008年新春纪念徽章生肖徽章2007版:鼠ITPUB新首页上线纪念徽章数据库板块每日发贴之星
      

发表于 2008-7-4 16:04 
谢谢ls两位,果然是lpad吧超过4000的字符串截取成4000了。
再次谢谢


__________________
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问