Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

làm thế nào để nối các chuỗi?

Vì vậy, tôi đoán lỗi là ORA-06502 và tôi có thể thấy cách bạn có thể nghĩ rằng điều này không áp dụng cho bạn trong tình huống này.

Tuy nhiên, đây là lỗi của wm_concat . Đây là một hàm và bị giới hạn bởi độ dài varchar tối đa của Oracle trong PL \ SQL là 32,767 và 4.000 trong SQL chuẩn. Thật không may, tôi cho rằng do cách thức hoạt động của wm_concat hoặc do bất kỳ ràng buộc nào thấp hơn trong hàm hoặc vì bạn đang sử dụng nó trong một lựa chọn, bạn không thể đến gần giới hạn trên.

Có một tùy chọn khác, stragg , Hàm tổng hợp chuỗi của Tom Kyte. Nếu chúng ta nhìn vào so sánh sau đây giữa cả hai, bạn sẽ thấy rằng chúng hoạt động gần như giống nhau và giới hạn của cả hai là độ dài khoảng 4.000, tức là tối đa SQL tiêu chuẩn. stragg nhanh hơn một chút, có thể là do bộ nhớ đệm.

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.

Về phần giải quyết, e rằng không thể. Một khi bạn đạt đến giới hạn đó, đó là nó. Bạn sẽ phải tìm một cách khác để thực hiện việc tổng hợp của mình hoặc tự hỏi bản thân xem bạn có thực sự cần phải.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle tổng hợp để nối các chuỗi bằng dấu phẩy và về cách viết các tổng hợp tùy chỉnh

  2. MS Access sang Oracle dễ dàng Chuyển đổi / Di chuyển

  3. Cách chính xác để cấp cho người dùng quyền truy cập vào các lược đồ bổ sung trong Oracle

  4. Làm cách nào để xem kết quả / đầu ra con trỏ trong Oracle SQL Developer?

  5. Hàm LPAD () trong Oracle