Oracle
 sql >> Baza danych >  >> RDS >> Oracle

jak łączyć ciągi?

Zgaduję, że błąd to ORA-06502 i widzę, jak możesz sądzić, że to nie dotyczy Ciebie w tej sytuacji.

Jest to jednak wina wm_concat . Jest to funkcja, która jest ograniczona przez maksymalną długość varchar Oracle w PL\SQL wynoszącą 32 767 i 4000 w standardowym SQL. Niestety, zakładam, że ze względu na sposób, w jaki działa wm_concat lub z powodu niższych ograniczeń w funkcji, albo dlatego, że używasz jej w selekcji, nie możesz zbliżyć się do górnego limitu.

Jest jeszcze jedna opcja, stragg , funkcja agregująca ciąg Toma Kyte'a. Jeśli spojrzymy na poniższe porównanie między tymi dwoma, zobaczysz, że działają prawie identycznie i że limit obu to długość około 4000, czyli standardowe maksimum SQL. stragg jest nieco szybszy, prawdopodobnie z powodu buforowania.

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 do rozwiązania tego, obawiam się, że nie możesz. Gdy osiągniesz ten limit, to wszystko. Musisz znaleźć inny sposób na wykonanie agregacji lub zadać sobie pytanie, czy naprawdę trzeba.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LongOpsWatcher w SQL Dev

  2. Funkcja SINH() w Oracle

  3. Funkcja DBTIMEZONE w Oracle

  4. ORA-00904 nieprawidłowy identyfikator w aliasie dekodowania

  5. FNDCPASS &AFPASSWD