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