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

jak zřetězit řetězce?

Hádám tedy, že chyba je ORA-06502 a chápu, jak si můžete myslet, že se vás to v této situaci netýká.

To je však chyba wm_concat . Toto je funkce a je omezena maximální délkou varchar společnosti Oracle v PL\SQL 32 767 a 4 000 ve standardním SQL. Bohužel předpokládám, že kvůli způsobu, jakým wm_concat funguje, nebo kvůli jakýmkoli nižším omezením ve funkci nebo protože ji používáte ve výběru, se nemůžete dostat ani k horní hranici.

Existuje další možnost, stragg , funkce agregace řetězců Toma Kytea. Pokud se podíváme na následující srovnání mezi těmito dvěma, uvidíte, že fungují téměř identicky a že limit obou je délka kolem 4 000, tj. standardní maximum SQL. stragg je o něco rychlejší, pravděpodobně kvůli ukládání do mezipaměti.

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.

Co se týče řešení, obávám se, že nedokážete. Jakmile dosáhnete tohoto limitu, je to. Budete si muset najít jiný způsob vytváření agregací nebo se sami sebe zeptat, zda skutečně potřeba.




  1. Použití rozšířených událostí k protokolování zastaralých funkcí používaných v instanci serveru SQL (příklad T-SQL)

  2. Cheat Sheet s příkazy SQL – Jak se naučit SQL za 10 minut

  3. Jak vytvořit tabulku Postgres s jedinečným kombinovaným primárním klíčem?

  4. Skenování alokačních příkazů