sql >> Databáze >  >> RDS >> Oracle

Jak upravím objekty BLOB (obsahující JSON) v Oracle SQL Developer?

Pokud spustíte dotaz v SQL Developer 3.1 (a pravděpodobně dřívějších verzích), který vrací objekt BLOB, můžete poklepat na konkrétní objekt BLOB, který vás zajímá, kde budete vyzváni buď k pokusu o odeslání dat do externího editor nebo pokus o to, aby se vestavěný ovládací prvek zobrazení SQL Developer pokusil interpretovat data jako obrázek nebo jako text. Vaše data JSON se pravděpodobně zobrazí správně, pokud zvolíte textovou možnost.

Pokud však chcete data změnit, budete muset vydat UPDATE skutečně nastavit data. SQL Developer nemá funkce pro přímou úpravu dat LOB. Například

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

aktualizuje zadaný řádek novými daty JSON zakódovanými pomocí znakové sady databáze. Pokud chcete data uložit do jiné znakové sady, string_to_raw přebírá volitelný druhý parametr, který určuje znakovou sadu. Pokud tedy chcete data ukládat pomocí znakové sady UTF-8, udělali byste něco takového

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

Samozřejmě, protože data JSON jsou textová, bylo by pro vás mnohem lepší data ukládat do CLOB, který je navržený pro ukládání znaků velkých objektů. Pak by SQL Developer (a další nástroje) mohl pouze zobrazit text, aniž by vyžadoval, abyste vybrali výsledek a poté provedli další akce k převodu na text. A nemuseli byste převádět data do RAW za účelem aktualizace dat v databázi.

Pokud jsou data pro string_to_raw příliš dlouhá zpracovat (což závisí na znakové sadě a datech, ale objeví se kdykoli RAW data přesahují 2000 bajtů), můžete data uložit do CLOB a poté jej převeďte na BLOB které používáte k aktualizaci tabulky. Je to trochu složitější, ale je to flexibilnější. V tomto příkladu vyplňuji data JSON na 3 200 znaků znakem '*' -- testovací data již samozřejmě nejsou platným JSON, ale to není pro účely této otázky důležité.

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. Vygenerujte dotaz pomocí 5 tabulek

  2. Příkaz If v rámci klauzule Where

  3. MySQL získá první nenulovou hodnotu po seskupení podle

  4. PostgreSQL na Dockeru:Jak nainstalovat a spustit závislosti pythonu pod `plpython3u`?