Tách biểu thức SQL dài tại dấu phân cách

Oct 20 2020

Bối cảnh

Tôi đang cố gắng nhập một kết xuất có một số dòng dài (8k + ký tự) bằng SQL * Plus, vì vậy tôi gặp lỗi SP2-0027: Input is too long (> 2499 characters). Đây là một giới hạn được mã hóa khó và không thể vượt qua.

Giải pháp mong đợi

Tôi muốn truyền dữ liệu đầu vào của mình bằng bash và chia dòng dài hơn chiều rộng dự kiến ​​trên ,ký tự cuối cùng (dấu phẩy).

Vì vậy, tôi nên có một cái gì đó như

cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe

Chi tiết

  1. Tôi biết rằng phiên bản mới hơn có thể chấp nhận các dòng lên đến 4999 ký tự nhưng tôi vẫn có các dòng dài hơn ( cat my_dump.sql | grep '.\{5000\}' | wc -l)
  2. Cập nhật bãi chứa bằng tay là không thực sự khả thi
  3. Tôi đã cố gắng sử dụng trnhưng điều này phân chia mọi dòng mà tôi không muốn
  4. Tôi đã cố gắng sử dụng fmtvà foldnhưng nó không có vẻ là có thể sử dụng một dấu phân cách tùy chỉnh
  5. Tôi hiện đang tìm kiếm sednhưng dường như không thể tìm ra regexp sẽ "tìm thấy kết quả trùng khớp cuối cùng ,trong 2500 ký tự đầu tiên nếu có hơn 2500 ký tự"

Trả lời

3 JJoao Oct 20 2020 at 10:18

Hãy thử một cái gì đó như:

sed -re '/.{2500}/ s/.{,2500},/&\n/g'

Giải trình:

  • /.{2500}/ nếu dòng chứa 2500 ký tự (hoặc nhiều hơn) ...
  • s/.{,2500},/&\n/gthay thế lên đến 2500 ký tự theo sau bằng ,cách thêm một dòng mới

Tôi sẽ không ngạc nhiên nếu điều này thay thế một số "," ...

3 muru Oct 20 2020 at 10:20

Tôi sẽ tưởng tượng một cái gì đó giống như lệnh awk này sẽ hoạt động:

awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'

Regex cho phép tối đa 2498 ký tự trước dấu phẩy, (vì vậy 2499 bao gồm cả dấu phẩy) và chèn một dòng mới sau dấu phẩy. (Tôi đã sử dụng 2499 vì thông báo lỗi đề cập đến số đó.)