Jika Anda menjalankan kueri di SQL Developer 3.1 (dan mungkin rilis sebelumnya) yang mengembalikan BLOB, Anda dapat mengklik dua kali pada BLOB tertentu yang Anda minati di mana Anda akan diminta untuk mencoba mengirim data ke eksternal editor atau untuk mencoba memiliki kontrol tampilan SQL Developer bawaan mencoba untuk menafsirkan data sebagai gambar atau sebagai teks. Data JSON Anda mungkin akan ditampilkan dengan benar jika Anda memilih opsi teks.
Namun, jika Anda ingin mengubah data, Anda harus mengeluarkan UPDATE
untuk benar-benar mengatur data. Pengembang SQL tidak memiliki fungsi untuk mengedit data LOB secara langsung. Misalnya
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
WHERE primary_key = <<some value>>
akan memperbarui baris yang ditentukan dengan data JSON baru yang dikodekan menggunakan set karakter basis data. Jika Anda ingin menyimpan data dalam kumpulan karakter lain, string_to_raw
mengambil parameter kedua opsional yang menentukan set karakter. Jadi jika Anda ingin menyimpan data menggunakan set karakter UTF-8, Anda akan melakukan sesuatu seperti ini
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
WHERE primary_key = <<some value>>
Tentu saja, karena data JSON bersifat tekstual, Anda akan jauh lebih baik menyimpan data dalam CLOB yang dirancang untuk menyimpan objek besar berkarakter. Kemudian Pengembang SQL (dan alat lainnya) hanya dapat menampilkan teks daripada mengharuskan Anda untuk memilih hasilnya dan kemudian mengambil tindakan tambahan untuk mengubahnya menjadi teks. Dan Anda tidak perlu mengonversi data menjadi RAW
untuk memperbarui data dalam database.
Jika data terlalu panjang untuk string_to_raw
untuk menangani (yang tergantung pada set karakter dan data tetapi akan terjadi kapan saja RAW
data melebihi 2000 byte), Anda dapat menyimpan data dalam CLOB
dan kemudian mengubahnya menjadi BLOB
yang Anda gunakan untuk memperbarui tabel. Itu sedikit lebih kompleks tetapi lebih fleksibel. Dalam contoh ini, saya menambahkan data JSON ke 3200 karakter dengan '*'-- jelas data pengujian bukan lagi JSON yang valid tetapi itu tidak penting untuk tujuan pertanyaan ini.
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;
/