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”过大。