sql >> Database >  >> RDS >> Oracle

hoe tekenreeksen samenvoegen?

Dus ik vermoed dat de fout ORA-06502 is en ik kan me voorstellen dat je denkt dat dit in deze situatie niet op jou van toepassing is.

Dit is echter de schuld van wm_concat . Dit is een functie en wordt beperkt door de maximale varchar-lengte van Oracle in PL\SQL van 32.767 en 4.000 in standaard SQL. Helaas neem ik aan dat vanwege de manier waarop wm_concat werkt of vanwege lagere beperkingen binnen de functie of omdat je het in een selectie gebruikt, je niet in de buurt van de bovengrens kunt komen.

Er is nog een andere optie, stragg , Tom Kyte's string-aggregatiefunctie. Als we naar de volgende vergelijking tussen de twee kijken, zul je zien dat ze bijna identiek presteren en dat de limiet van beide een lengte van ongeveer 4.000 is, d.w.z. het standaard SQL-maximum. stragg is iets sneller, waarschijnlijk door caching.

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.

Wat betreft het oplossen ervan, ik ben bang dat je dat niet kunt. Zodra je die limiet hebt bereikt, is dat het. U zult een andere manier moeten vinden om uw aggregaties te doen of uzelf afvragen of u echt moet.




  1. Hoe taalinstellingen uw FORMAT()-resultaten in SQL Server kunnen beïnvloeden (T-SQL-voorbeelden)

  2. PostgreSQL - GROUP BY-clausule

  3. Oracle Sequence genereert geen doorlopend nummer

  4. SQL - Vraag om het IP-adres van de server