Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

bagaimana cara menggabungkan string?

Jadi, saya kira kesalahannya adalah ORA-06502 dan saya dapat melihat bagaimana Anda mungkin berpikir bahwa ini tidak berlaku untuk Anda dalam situasi ini.

Namun, ini adalah kesalahan wm_concat . Ini adalah fungsi dan dibatasi oleh panjang varchar maksimum Oracle di PL\SQL sebesar 32.767 dan 4.000 dalam SQL standar. Sayangnya, saya berasumsi, karena cara kerja wm_concat atau karena batasan yang lebih rendah dalam fungsi atau karena Anda menggunakannya dalam pilihan, Anda tidak dapat mendekati batas atas.

Ada pilihan lain, stragg , fungsi agregat string Tom Kyte. Jika kita melihat perbandingan berikut antara keduanya, Anda akan melihat bahwa kinerjanya hampir sama dan batas keduanya adalah panjang sekitar 4.000, yaitu standar maksimum SQL. stragg sedikit lebih cepat, mungkin karena 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.

Adapun untuk menyelesaikannya, saya khawatir Anda tidak bisa. Setelah Anda mencapai batas itu, itu saja. Anda harus menemukan cara lain untuk melakukan agregasi atau bertanya pada diri sendiri apakah Anda benar-benar perlu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan ke Oracle Database melalui C#?

  2. cara memilih daftar 10.000 id unik dari dual di Oracle SQL

  3. RAWTONHEX() Fungsi di Oracle

  4. hitung saldo berjalan dalam kueri oracle

  5. Jalankan SQL dari file batch