sql >> Database >  >> RDS >> Oracle

Hoe u REPLACE belt met CLOB (zonder 32K te overschrijden)

Hier is een ruwe eerste opzet voor een functie die het werk zal doen met bepaalde beperkingen, het is nog niet erg goed getest:

function replace_with_clob
  (i_source in clob
  ,i_search in varchar2
  ,i_replace in clob
  ) return clob is
  l_pos pls_integer;
begin
  l_pos := instr(i_source, i_search);
  if l_pos > 0 then
    return substr(i_source, 1, l_pos-1)
        || i_replace
        || substr(i_source, l_pos+length(i_search));
  end if;
  return i_source;
end replace_with_clob;

Het doet slechts een enkele vervanging op de eerste instantie van de zoekterm.

declare
  v2 varchar2(32767);
  cl_small clob;
  cl_big clob;
  cl_big2 clob;
begin
  v2 := rpad('x', 32767, 'x');
  dbms_output.put_line('v2:' || length(v2));
  cl_small := v2;
  dbms_output.put_line('cl_small:' || length(cl_small));
  cl_big := v2 || 'y' || v2;
  dbms_output.put_line('cl_big[1]:' || length(cl_big));
  cl_big2 := replace(cl_big, 'y', cl_small);
  dbms_output.put_line('cl_big[2]:' || length(cl_big2));
  cl_big2 := replace_with_clob(cl_big, 'y', cl_big); 
  dbms_output.put_line('cl_big[3]:' || length(cl_big2));
end;
/

v2:32767
cl_small:32767
cl_big[1]:65535
cl_big[2]:98301
cl_big[3]:131069


  1. Verplaats dubbele waarden naar een andere kolom

  2. Hoe hernoem ik een index in MySQL

  3. Kan rij in Sqlite in Android niet bijwerken, maar geeft geen enkele fout

  4. Groepeer rijen op jaarbandinterval