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

LỖI ở dòng 191:ORA-01489:kết quả của việc nối chuỗi quá dài

VARCHAR2 được giới hạn ở 4000 byte. Nếu bạn gặp lỗi này

Sau đó, khá rõ ràng là nối vượt quá 4000 byte.

Bây giờ phải làm gì?

Giải pháp đầu tiên của bạn để sử dụng CLOB thay thế là đúng.

select TO_CLOB(a)|| TO_CLOB(b)|| TO_CLOB(c) || TO_CLOB(d) 

Có vẻ như vấn đề thực sự của bạn là lưu vào tệp

Mặc dù bạn không đăng cách lưu khối kết quả vào một tệp, nhưng tôi tin rằng bạn đang làm không đúng. Nếu bạn cố gắng lưu vào tệp theo cách giống như cách bạn làm với VARCHAR2, bạn đang làm sai.

Trước tiên, bạn cần sử dụng dbms_lob.read để đọc khối từ cơ sở dữ liệu, sau đó sử dụng utl_file.put_raw để ghi vào tệp.

DECLARE
    position NUMBER := 1;
    byte_length NUMBER := 32760;
    length NUMBER;
    vblob BLOB;
    rawlob RAW(32760);
    temp NUMBER;
    output utl_file.file_type;
BEGIN
    -- Last parameter is maximum number of bytes returned.
    -- wb stands for write byte mode
    output := utl_file.fopen('DIR', 'filename', 'wb', 32760);

    position := 1;
    select dbms_lob.getlength(yourLob)
    into len
    from somewhere
    where something;

    temp := length;

    select yourLob
    into vlob
    from somewhere
    where something;

    IF len < 32760 THEN
        utl_file.put_raw(output, vblob);
        -- Don't forget to flush
        utl_file.fflush(output);
    ELSE -- write part by part
        WHILE position < len AND byte_length > 0
        LOOP
           dbms_lob.read(vblob, byte_length, position, rawlob);

           utl_file.put_raw(output,rawlob);

           -- You must admit, you would have forgot to flush.
           utl_file.fflush(output); 

           position := position + byte_length;

           -- set the end position if less than 32000 bytes
           temp := temp - bytelen;
           IF temp < 32760 THEN
               byte_length := temp;
           END IF;
    END IF;
END;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi keep secure_rank từ truy vấn Oracle thành postgres

  2. Làm thế nào để sắp xếp theo số đầu tiên với truy vấn SQL của Oracle?

  3. Chuyển đổi sang datetime từ Oracle

  4. Có cách nào để chuyển một kiểu tùy chỉnh từ C # sang Oracle bằng System.Data.OracleClient không?

  5. Chỉ sao lưu lược đồ SQL?