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

Oracle 替换字段中的字符时,REPLACE语句和WHERE语句之间的区别?,oracle,oracle11g,Oracle,Oracle11g,如果以前有人问过,我道歉。我有一个名为POSITION的字段,它是VARCHAR2(20字节)。如果我用这句话 update SA_ASSET set POSITION = REPLACE(POSITION, 'SOLIDS BLDG', 'SOLIDS STRUCTURE') where location = 'SOUTH COUNTY REGIONAL AWT PLAN'; 我想出了一个办法 ORA-12899:列“SYNERGEN”。“SA_资产”。“位置”的值太大 (实际值:21,最大

如果以前有人问过,我道歉。我有一个名为
POSITION
的字段,它是
VARCHAR2(20字节)
。如果我用这句话

update SA_ASSET
set POSITION = REPLACE(POSITION, 'SOLIDS BLDG', 'SOLIDS STRUCTURE')
where location = 'SOUTH COUNTY REGIONAL AWT PLAN';
我想出了一个办法

ORA-12899:列“SYNERGEN”。“SA_资产”。“位置”的值太大 (实际值:21,最大值:20)错误

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

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

替换的长度是相同的(15个字符和15个字节),但是使用REPLACE语句会有所不同。这种情况发生在字符/字节计数小于20的几个场合。我们使用的是Oracle Database 11g Enterprise Edition 11.1.0.7.0-64位生产版,如果这有什么不同的话。有人遇到过这种情况并找到了原因吗?

更换后的原因很简单,因为您的数据太大,无法容纳列

数据(示例):

然后您尝试设置:

'SOLIDS STRUCTURE SOME T' > 20 characters

原因很简单,因为替换后的数据对于列来说太大了

数据(示例):

然后您尝试设置:

'SOLIDS STRUCTURE SOME T' > 20 characters

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


可以有一行,其
位置类似于
'SOLIDS BLDG where'
(已经有20个字符长),对于该行,replace命令将返回
replace('SOLIDS BLDG where'、'SOLIDS BLDG'、'SOLIDS STRUCTURE')=>'SOLIDS STRUCTURE where'
,显然大于20。在第二条语句中,这并没有发生,因为您正在显式地过滤被更新的
“SOLIDS BLDG WHATEVER”

您的语句在语义上是不同的。由于工作语句具有额外的过滤条件(
和POSITION='SOLIDS BLDG'
),在失败语句中更新的行数多于第一个语句中的行数


可以有一行,其
位置类似于
'SOLIDS BLDG where'
(已经有20个字符长),对于该行,replace命令将返回
replace('SOLIDS BLDG where'、'SOLIDS BLDG'、'SOLIDS STRUCTURE')=>'SOLIDS STRUCTURE where'
,显然大于20。在第二条语句中,这并没有发生,因为您正在显式地过滤被更新的
“SOLIDS BLDG WHATEVER”

REPLACE替换文本字符串中出现的每个模式,但不会覆盖它。所以,如果您的原始字符串是20个字符,并且您想用5个字符的短语替换4个字符的短语,那么您将得到一个21个字符的字符串

如果您的列设置为20个字符宽,那么最终将出现您遇到的ORA-12899错误。例如:

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:列“SCHEMA”“TEST1”“COL2”的值太大(实际值:11,最大值:10)


“替换”将替换文本字符串中出现的每个模式,但不会覆盖它。所以,如果您的原始字符串是20个字符,并且您想用5个字符的短语替换4个字符的短语,那么您将得到一个21个字符的字符串

如果您的列设置为20个字符宽,那么最终将出现您遇到的ORA-12899错误。例如:

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:列“SCHEMA”“TEST1”“COL2”的值太大(实际值:11,最大值:10)


从数据来看似乎不太可能,但NLS_语言和NLS_字符集的设置是什么。有没有带重音符号的数据?您可能有一行,
定位“SOLIDS BLDG”
,但
“SOLIDS BLDG”
是一个子字符串。“SOLIDS BLDG 20000”行中的某个内容,其中替换的“SOLIDS STRUCTURE 20000”
太大。从数据来看似乎不太可能,但NLS\U语言和NLS\U字符集的设置是什么。有没有带重音符号的数据?您可能有一行,
定位“SOLIDS BLDG”
,但
“SOLIDS BLDG”
是一个子字符串。在“SOLIDS BLDG 20000”行中,替换的“SOLIDS STRUCTURE 20000”过大。