替换字段中的字符时REPLACE语句和WHERE之间的区别?

时间:2015-11-02 16:00:01

标签: oracle oracle11g

如果之前有人问过,我道歉。我有一个名为POSITION的字段VARCHAR2(20 BYTE)。如果我使用声明

update SA_ASSET
set POSITION = REPLACE(POSITION, 'SOLIDS BLDG', 'SOLIDS STRUCTURE')
where location = 'SOUTH COUNTY REGIONAL AWT PLAN';

我想出了一个

  

ORA-12899:列“SYNERGEN”的值太大。“SA_ASSET”。“POSITION”   (实际:21,最大:20)错误。

如果我使用WHERE语句执行相同的操作:

update SA_ASSET
set POSITION = 'SOLIDS STRUCTURE'
where location = 'SOUTH COUNTY REGIONAL AWT PLAN'
AND POSITION = 'SOLIDS BLDG';

替换的长度是相同的(15个字符和15个字节)但使用REPLACE语句有所不同。这种情况发生在char /字节数小于20的情况下。我们正在使用Oracle数据库11g企业版11.1.0.7.0版 - 64位生产如果有任何区别有任何人遇到这个并得到答案为什么?

3 个答案:

答案 0 :(得分:2)

在更换数据对于列太大之后,原因很简单。

数据(示例):

POSITION = 'SOLIDS BLDG SOME T'             -- 18 characters
LOCATION = 'SOUTH COUNTY REGIONAL AWT PLAN'


update SA_ASSET
set POSITION = REPLACE(POSITION, 'SOLIDS BLDG', 'SOLIDS STRUCTURE')
where location = 'SOUTH COUNTY REGIONAL AWT PLAN';

然后您尝试SET

'SOLIDS STRUCTURE SOME T' > 20 characters

答案 1 :(得分:2)

您的陈述在语义上有所不同。在失败的语句中,您更新的行数多于第一行,因为工作的行具有额外的过滤条件(AND POSITION = 'SOLIDS BLDG')。

你可以有一行POSITION就像'SOLIDS BLDG WHATEVER'(已经是20个字符),替换命令会返回REPLACE('SOLIDS BLDG WHATEVER', 'SOLIDS BLDG', 'SOLIDS STRUCTURE') ==> 'SOLIDS STRUCTURE WHATEVER',显然长于20在第二个语句中,由于您明确过滤'SOLIDS BLDG WHATEVER'而未进行更新,因此不会发生这种情况。

答案 2 :(得分:0)

REPLACE替换文本字符串中每次出现的模式,它不会覆盖它。因此,如果您的原始字符串是20个字符,并且您想要用5个字符的短语替换4个字符的短语,那么您最终会得到一个包含21个字符的字符串。

如果您的列设置为20个字符宽,那么您最终会遇到您遇到的ORA-12899错误。 E.g:

create table test1 (col1 number,
                    col2 varchar2(10));

insert into test1 (col1, col2)
values (1, 'abcdefghij');

commit;

select col1,
       col2,
       replace(col2, 'j', 'xy') new_col2,
       length(replace(col2, 'j', 'xy')) length_new_col2
from   test1
where  col1 = 1;

      COL1 COL2       NEW_COL2             LENGTH_NEW_COL2
---------- ---------- -------------------- ---------------
         1 abcdefghij abcdefghixy                       11

update test1
set col2 = replace(col2, 'j', 'xy')
where col1 = 1;
  

ORA-12899:对于列#34; SCHEMA"。" TEST1"。" COL2" (实际:11,最大值:10)

相关问题