2015-11-02 45 views
1

如果之前已經詢問過,我表示歉意。我有一個名爲POSITION的字段,它是VARCHAR2(20 BYTE)。如果我使用的語句替換字段中的字符時,REPLACE語句和WHERE之間的區別?

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

我想出了一個

ORA-12899:。值太大,列 「SYNERGEN」 「SA_ASSET」, 「位置」 (實際: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

這似乎從不可能數據,但NLS_LANGUAGE和NLS_CHARACTERSET的設置是什麼。有沒有機會有口音的數據? – kevinsky

+2

您可能有一排位置<>'SOLIDS BLDG'',但'SOLIDS BLDG''是一個子字符串。一些線路「SOLIDS BLDG 20000」,其中「SOLID STRUCTURE 20000」的替換物太大。 –

回答

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 
+0

秒前) –

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'被更新。

0

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:值太大,列 「模式」 「TEST1」 「COL2。」(實際:11,最大:10)

相關問題