sql >> Databasteknik >  >> RDS >> Oracle

hur sammanfogar man strängar?

Så jag antar att felet är ORA-06502 och jag kan se hur du kanske tror att detta inte gäller dig i den här situationen.

Detta är dock felet hos wm_concat . Detta är en funktion och är begränsad av Oracles maximala varchar-längd i PL\SQL på 32 767 och 4 000 i standard SQL. Tyvärr antar jag att du inte kan komma i närheten av den övre gränsen på grund av hur wm_concat fungerar eller på grund av eventuella lägre begränsningar inom funktionen eller för att du använder den i ett urval.

Det finns ett annat alternativ, stragg , Tom Kytes strängaggregatfunktion. Om vi ​​tittar på följande jämförelse mellan de två kommer du att se att de fungerar nästan identiskt och att gränsen för båda är en längd på cirka 4 000, d.v.s. standard SQL-maximum. stragg är något snabbare, förmodligen på grund av cachning.

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.

När det gäller att lösa det är jag rädd att du inte kan. När du väl når den gränsen är det det. Du måste hitta ett annat sätt att göra dina sammanställningar eller fråga dig själv om du verkligen behöver.




  1. Hämtar datum i sql-servern, CURRENT_TIMESTAMP vs GetDate()

  2. SQL-fråga för trädtabell

  3. Tabelluppslagningar i SortCL-kompatibla IRI-jobb

  4. Oracle Pivot-fråga ger kolumner med citattecken runt kolumnnamnen. Vad?