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

Làm cách nào để chỉnh sửa BLOB (chứa JSON) trong Oracle SQL Developer?

Nếu bạn chạy một truy vấn trong SQL Developer 3.1 (và có thể là các bản phát hành trước đó) trả về BLOB, bạn có thể nhấp đúp vào BLOB cụ thể mà bạn quan tâm, nơi bạn sẽ được nhắc cố gắng gửi dữ liệu ra bên ngoài trình soạn thảo hoặc để cố gắng điều khiển hiển thị SQL Developer tích hợp cố gắng diễn giải dữ liệu dưới dạng hình ảnh hoặc dưới dạng văn bản. Dữ liệu JSON của bạn có thể sẽ hiển thị chính xác nếu bạn chọn tùy chọn văn bản.

Tuy nhiên, nếu bạn muốn thay đổi dữ liệu, bạn sẽ phải cấp UPDATE để thực sự thiết lập dữ liệu. Nhà phát triển SQL không có chức năng chỉnh sửa trực tiếp dữ liệu LOB. Ví dụ

UPDATE table_name
   SET column_with_json_data = 
          utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
 WHERE primary_key = <<some value>>

sẽ cập nhật hàng được chỉ định với dữ liệu JSON mới được mã hóa bằng cách sử dụng bộ ký tự cơ sở dữ liệu. Nếu bạn muốn lưu trữ dữ liệu trong một số bộ ký tự khác, hãy string_to_raw nhận tham số thứ hai tùy chọn chỉ định bộ ký tự. Vì vậy, nếu bạn muốn lưu trữ dữ liệu bằng cách sử dụng bộ ký tự UTF-8, bạn phải làm như thế này

UPDATE table_name
   SET column_with_json_data = 
          utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
 WHERE primary_key = <<some value>>

Tất nhiên, vì dữ liệu JSON là dạng văn bản, nên tốt hơn hết bạn nên lưu trữ dữ liệu trong CLOB được thiết kế để lưu trữ các đối tượng lớn có ký tự. Sau đó, SQL Developer (và các công cụ khác) chỉ có thể hiển thị văn bản thay vì yêu cầu bạn chọn kết quả và sau đó thực hiện các hành động bổ sung để chuyển nó thành văn bản. Và bạn sẽ không phải chuyển đổi dữ liệu thành RAW để cập nhật dữ liệu trong cơ sở dữ liệu.

Nếu dữ liệu quá dài cho string_to_raw để xử lý (tùy thuộc vào bộ ký tự và dữ liệu nhưng sẽ xảy ra bất kỳ lúc nào RAW dữ liệu vượt quá 2000 byte), bạn có thể lưu trữ dữ liệu trong CLOB và sau đó chuyển đổi thành BLOB mà bạn sử dụng để cập nhật bảng. Điều đó phức tạp hơn một chút nhưng nó linh hoạt hơn. Trong ví dụ này, tôi đệm dữ liệu JSON ra 3200 ký tự bằng dấu '*' - rõ ràng dữ liệu thử nghiệm không còn hợp lệ JSON nữa nhưng điều đó không quan trọng đối với mục đích của câu hỏi này.

declare
  l_blob        blob;
  l_clob        clob := rpad('{"foo": {"id": "1", "value": "2", "name": "bob"}}',3200,'*');
  l_amt         integer := dbms_lob.lobmaxsize;
  l_dest_offset integer := 1;
  l_src_offset  integer := 1;
  l_csid        integer := dbms_lob.default_csid;
  l_ctx         integer := dbms_lob.default_lang_ctx;
  l_warn        integer;
begin
  dbms_lob.createTemporary( l_blob, false );
  dbms_lob.convertToBlob( l_blob,
                          l_clob,
                          l_amt,
                          l_dest_offset,
                          l_src_offset,
                          l_csid,
                          l_ctx,
                          l_warn );

  -- You'll want to add a WHERE clause as well
  update json_data
     set data = l_blob;

  dbms_lob.freeTemporary( l_blob );
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. Cách đặt thuộc tính kết nối (bao gồm Từ đồng nghĩa)

  2. Python> Kết nối với JDBC với tên dịch vụ Oracle (jaydebeapi)

  3. Kết nối JDBC với Oracle Clustered

  4. Làm thế nào bạn có thể buộc một hàm trong mệnh đề where thực thi một lần trong oracle?

  5. PL / SQL viết lại truy vấn nối với mệnh đề 'IN'