sql >> Database teknologi >  >> RDS >> Oracle

hvordan kan man sammenkæde strenge?

Så jeg gætter på, at fejlen er ORA-06502 og jeg kan se, hvordan du måske tror, ​​at dette ikke gælder for dig i denne situation.

Dette er dog wm_concats fejl . Dette er en funktion og er begrænset af Oracles maksimale varchar-længde i PL\SQL på 32.767 og 4.000 i standard SQL. Desværre, går jeg ud fra, på grund af den måde, wm_concat fungerer på eller på grund af lavere begrænsninger i funktionen, eller fordi du bruger den i et udvalg, at du ikke kan komme i nærheden af ​​den øvre grænse.

Der er en anden mulighed, stragg , Tom Kytes strengaggregatfunktion. Hvis vi ser på den følgende sammenligning mellem de to, vil du se, at de fungerer næsten identisk, og at grænsen for begge er en længde på omkring 4.000, dvs. standard SQL-maksimum. stragg er lidt hurtigere, sandsynligvis på grund af 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.

Med hensyn til at løse det, er jeg bange for, at du ikke kan. Når du når den grænse, er det det. Du bliver nødt til at finde en anden måde at lave dine sammenlægninger på eller spørge dig selv, om du virkelig skal.




  1. Hvad gør (+) i Oracle SQL?

  2. Sådan tilføjes rangeringspositioner til rækker med DENSE_RANK() i SQL

  3. Hvorfor kommer NULL-værdier først, når du bestiller DESC i en PostgreSQL-forespørgsel?

  4. Eksporter data til Excel fra Oracle Table ved hjælp af PL SQL