我有一张桌子:
CREATE TABLE abc ( details clob);
INSERT INTO abc ( details ) VALUES ( 'img src="/ShowAffix.do?existAttatchList=/nfsc' );
我想更新表格的details
字段,将'ShowAffix'
替换为短语'showPhoto'
。
预期产出:
img src="/showPhoto.do?existAttatchList=/nfsc
答案 0 :(得分:0)
Oracle 11g R2架构设置:
CREATE TABLE abc ( details clob);
INSERT INTO abc ( details ) VALUES ( 'img src="/ShowAffix.do?existAttatchList=/nfsc' );
UPDATE abc
SET details = REPLACE( details, 'ShowAffix', 'showPhoto' )
WHERE INSTR( details, 'ShowAffix' ) > 0;
查询1 :
SELECT *
FROM abc
<强> Results 强>:
| DETAILS |
|-----------------------------------------------|
| img src="/showPhoto.do?existAttatchList=/nfsc |
<强>更新强>:
对于大型CLOB
,您可以创建一个函数:
CREATE FUNCTION lob_replace(
i_lob IN clob,
i_what IN varchar2,
i_with IN clob,
i_offset IN INTEGER DEFAULT 1,
i_nth IN INTEGER DEFAULT 1
) RETURN CLOB
AS
o_lob CLOB;
n PLS_INTEGER;
l_lob PLS_INTEGER;
l_what PLS_INTEGER;
l_with PLS_INTEGER;
BEGIN
IF i_lob IS NULL
OR i_what IS NULL
OR i_offset < 1
OR i_offset > DBMS_LOB.LOBMAXSIZE
OR i_nth < 1
OR i_nth > DBMS_LOB.LOBMAXSIZE
THEN
RETURN NULL;
END IF;
n := NVL( DBMS_LOB.INSTR( i_lob, i_what, i_offset, i_nth ), 0 );
l_lob := DBMS_LOB.GETLENGTH( i_lob );
l_what := LENGTH( i_what );
l_with := NVL( DBMS_LOB.GETLENGTH( i_with ), 0 );
DBMS_LOB.CREATETEMPORARY( o_lob, FALSE );
IF n > 0 THEN
IF n > 1 THEN
DBMS_LOB.COPY( o_lob, i_lob, n-1, 1, 1 );
END IF;
IF l_with > 0 THEN
DBMS_LOB.APPEND( o_lob, i_with );
END IF;
IF n + l_what <= l_lob THEN
DBMS_LOB.COPY( o_lob, i_lob, l_lob - n - l_what + 1, n + l_with, n + l_what );
END IF;
ELSE
DBMS_LOB.APPEND( o_lob, i_lob );
END IF;
RETURN o_lob;
END;
/
然后在更新中使用它:
UPDATE abc
SET details = LOB_REPLACE(
details,
'ShowAffix',
'showPhoto'
)
WHERE DBMS_LOB.INSTR( details, 'ShowAffix' ) > 0
/