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

Tại sao tôi gặp lỗi sau hàm LISTAGG:"kết quả của việc nối chuỗi quá dài? *

Như các nhà bình luận khác đã nói, không có cách nào để tránh lỗi như vậy cho đến khi Oracle 12.2 (trong đó List_agg có tùy chọn mới "ON OVERFLOW TRUNCATE").

Trong các phiên bản trước của oracle, nếu bạn nối các chuỗi dài hơn 4000 byte, bạn sẽ gặp lỗi đó. bạn KHÔNG có cách nào để ngăn chặn nó.

Nếu bạn vẫn cần làm điều đó trong các phiên bản trước, bạn phải viết hàm của riêng mình để thực hiện việc đó và bạn cần sửa đổi truy vấn của mình cho phù hợp:

Chức năng tùy chỉnh này có thể giải quyết vấn đề của bạn

 create or replace type TAB_STRINGS is table of varchar2(4000) 
 /
 create or replace function My_list_agg(strings in TAB_STRINGS,
                      separator  in varchar2,
                      max_len    integer) return varchar2 deterministic is
   result varchar2(32000);
   tmp    varchar2(32000);
 begin
   result := null;
   if strings is not null then
       for idx in strings.first .. strings. last loop
         tmp := strings(idx);
         if tmp is not null then
           if result is null then
             exit when length(tmp) > max_len;
             result := tmp;
           else
             exit when(length(result) + length(separator) + length(tmp)) > max_len;
             result := result || separator || tmp;
           end if;
         end if;
       end loop;
   end if;
   return result;
 end;
 /

bạn cần sử dụng toán tử CAST / COLLECT để sử dụng nó.
đây là ví dụ sử dụng:

   select table_name,
          My_list_agg(  
                 -- first argument: array of strings to be concatenated
                 cast ( collect (column_name order by column_name) as TAB_STRINGS),
                 -- second (optional) argument: the separator
                 ',',
                 -- third argument (optional): the maximum length of the string to be returned
                 1000   
          ) as column_list
   from user_tab_columns t
   group by table_name
   order by table_name



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối với cơ sở dữ liệu Oracle bằng Swift phía máy chủ

  2. Yêu cầu khôi phục trước khi sao lưu

  3. Cách đặt ưu tiên cho giá trị null trong khi chọn

  4. ORA-00947 Không đủ giá trị khi khai báo kiểu trên toàn cầu

  5. Cơ sở dữ liệu Oracle 21c