Oracle
 sql >> база данни >  >> RDS >> Oracle

как да конкатенира низове?

И така, предполагам, че грешката е ORA-06502 и виждам как може да си помислите, че това не се отнася за вас в тази ситуация.

Това обаче е грешка на wm_concat . Това е функция и е ограничена от максималната дължина на varchar на Oracle в PL\SQL от 32 767 и 4 000 в стандартния SQL. За съжаление, предполагам, че поради начина, по който wm_concat работи, или поради някакви долни ограничения във функцията или защото го използвате при избор, не можете да стигнете до горната граница.

Има и друга опция, stragg , функцията за обобщаване на низове на Том Кайт. Ако погледнем следното сравнение между двете, ще видите, че те работят почти идентично и че границата на двете е дължина от около 4000, т.е. стандартният максимум на SQL. stragg е малко по-бърз, вероятно поради кеширане.

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.

Що се отнася до решаването му, страхувам се, че не можете. След като достигнете тази граница, това е всичко. Ще трябва да намерите различен начин да правите своите обобщения или да се запитате дали наистина трябва.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Запитване за връзки с външни ключове на таблица

  2. Хибернация на оракул, @GeneratedValue(strategy =GenerationType.AUTO)

  3. Group_concat MySQL функцията е еквивалентна в Oracle

  4. Импортиране на .csv файл в приложение на Oracle Forms

  5. Как да изчистите пула за връзки ODP.NET при грешки при свързване?