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;
/