sql >> Databáze >  >> RDS >> Oracle

Jak volat REPLACE s CLOB (bez překročení 32K)

Zde je hrubý první návrh funkce, která bude dělat svou práci s určitými omezeními, zatím nebyla příliš dobře otestována:

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;

Provede pouze jedno nahrazení první instance hledaného výrazu.

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. arabský znak není správně vložen (jako ????) v databázi Oracle?

  2. vyberte dva nejnovější řádky pro každého uživatele, abyste získali rozdíl ve sloupci (MySQL)

  3. Proč se pro tento dotaz nepoužívá index NLSSORT?

  4. Proaktivní kontroly stavu serveru SQL, část 1:Místo na disku