Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara mengedit BLOB (mengandung JSON) di Oracle SQL Developer?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menggunakan tabel angka dalam Pernyataan SELECT INTO

  2. Bagaimana cara menutup paksa koneksi dari kumpulan koneksi ketika terlalu banyak waktu untuk menutup?

  3. Oracle:Operasi aritmatika menghasilkan overflow

  4. Bagaimana cara menginstal Universal Oracle Installer di Ubuntu?

  5. Temukan entri duplikat di kolom