更新Clob列,但部分值?

时间:2017-10-31 08:37:43

标签: sql oracle

我有一张桌子:

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

1 个答案:

答案 0 :(得分:0)

SQL Fiddle

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,您可以创建一个函数:

SQL Fiddle

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
/
相关问题