Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

como concatenar strings?


Então, suponho que o erro seja ORA-06502 e posso ver como você pode pensar que isso não se aplica a você nesta situação.

No entanto, isso é culpa de wm_concat . Esta é uma função e é limitada pelo comprimento máximo de varchar do Oracle em PL\SQL de 32.767 e 4.000 em SQL padrão. Infelizmente, suponho que, devido à maneira como wm_concat funciona ou por causa de quaisquer restrições inferiores dentro da função ou porque você está usando em um select, você não pode chegar perto do limite superior.

Existe outra opção, stragg , a função de agregação de strings de Tom Kyte. Se observarmos a comparação a seguir entre os dois, você verá que eles têm um desempenho quase idêntico e que o limite de ambos é um comprimento de cerca de 4.000, ou seja, o máximo padrão do SQL. stragg é um pouco mais rápido, provavelmente devido ao cache.
SQL> set serveroutput on
SQL>
SQL> create table tmp_test ( a varchar2(30) );

Table created.

SQL> insert into tmp_test
  2   select object_name
  3     from all_objects
  4          ;

81219 rows created.

SQL>  commit ;

Commit complete.

SQL>
SQL> declare
  2
  3    i integer := 1;
  4    k number(10);
  5    v_stragg varchar2(32767);
  6    v_test varchar2(32767) := '';
  7    start_time timestamp;
  8
  9  begin
 10
 11    select count(*)
 12      into k
 13      from tmp_test;
 14
 15    for i in 1 .. k loop
 16      start_time := systimestamp;
 17      begin
 18
 19        select wm_concat(a) into v_test
 20          from tmp_test
 21         where rownum < i;
 22
 23      exception when others then
 24        dbms_output.put_line('wm_concat: ' || length(v_test));
 25        dbms_output.put_line(systimestamp - start_time);
 26        exit;
 27     end;
 28    end loop;
 29
 30    for i in 1 .. k loop
 31      start_time := systimestamp;
 32
 33      select stragg(a) into v_test
 34        from tmp_test
 35       where rownum < i;
 36
 37      if v_test = 'OVERFLOW' then
 38        dbms_output.put_line('stragg: ' || length(v_stragg));
 39        dbms_output.put_line(systimestamp - start_time);
 40        exit;
 41      else v_stragg := v_test;
 42      end if;
 43    end loop;
 44  end;
 45  /
wm_concat: 3976
+000000000 00:00:00.005886000
stragg: 3976
+000000000 00:00:00.005707000

PL/SQL procedure successfully completed.

Quanto a resolvê-lo, temo que você não possa. Depois de atingir esse limite, é isso. Você terá que encontrar uma maneira diferente de fazer suas agregações ou se perguntar se realmente preciso.