如果之前有人问过,我道歉。我有一个名为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位生产如果有任何区别有任何人遇到这个并得到答案为什么?
答案 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)