日期:2014-05-17  浏览次数:20813 次

不可思议的sql问题!!!!!
UPDATE bcn_cus_address_end SET 
install_addr1=address1,
install_addr2=address2,
install_addr3=address3,
install_addr4=address4,
install_build_code=build_code,
install_addr_code=addr_code,
install_floor=Floor
WHERE
install_addr1 IS null 
AND Length(Nvl(address1,' '))<=40
AND Length(Nvl(address2,' '))<=40
AND Length(Nvl(address3,' '))<=80
AND Length(Nvl(address4,' '))<=160

运行结果:
ORA-12899: value too large for column "INC"."BCN_CUS_ADDRESS_END"."INSTALL_ADDR2" (actual: 45, maximum: 40)
                                                                          


SELECT Length(address2) FROM bcn_cus_address_end WHERE Length(address2)>40
运行结果:
LENGTH(ADDRESS2)
              57
              41
              44
              50
              57
              43

请问,为何update的时候出错???????
------解决方案--------------------
可能跟字段类型有关,把install_addr2类型定义发出来看看,length()返回以字符为单位的长度
------解决方案--------------------
引用:
可能跟字段类型有关,把install_addr2类型定义发出来看看,length()返回以字符为单位的长度


isntall_addr2  varchar2(40)
------解决方案--------------------
这么神奇的问题,可以加Q远程看看么
------解决方案--------------------
引用:
这么神奇的问题,可以加Q远程看看么

公司上不了Q呢。我也觉得很奇怪,怎么老是报错,难道
AND Length(Nvl(address2,' '))<=40

失效了么?

另外,不加NVL是可以update的。但是address1或address2或address3或address4为null的话就update不了了。
------解决方案--------------------
数据中有中文,所以我猜应该是中文在作怪。谢谢关注此贴的人!