Om du kör en fråga i SQL Developer 3.1 (och förmodligen tidigare versioner) som returnerar en BLOB, kan du dubbelklicka på den speciella BLOB du är intresserad av där du blir ombedd att antingen försöka skicka data till en extern editor eller för att försöka få den inbyggda SQL Developer-visningskontrollen att försöka tolka data som en bild eller som text. Din JSON-data kommer förmodligen att visas korrekt om du väljer textalternativet.
Om du vill ändra data måste du dock utfärda en UPDATE
för att faktiskt ställa in data. SQL Developer har inte funktionen att direkt redigera LOB-data. Till exempel
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
WHERE primary_key = <<some value>>
kommer att uppdatera den angivna raden med den nya JSON-datan kodad med hjälp av databasteckenuppsättningen. Om du vill lagra data i någon annan teckenuppsättning, string_to_raw
tar en valfri andra parameter som specificerar teckenuppsättningen. Så om du vill lagra data med hjälp av teckenuppsättningen UTF-8, skulle du göra något så här
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
WHERE primary_key = <<some value>>
Naturligtvis, eftersom JSON-data är textbaserad, skulle du vara mycket bättre av att lagra data i en CLOB som är utformad för att lagra stora karaktärsobjekt. Då kan SQL Developer (och andra verktyg) bara visa texten istället för att kräva att du väljer resultatet och sedan vidtar ytterligare åtgärder för att konvertera det till text. Och du skulle inte behöva konvertera data till RAW
för att uppdatera data i databasen.
Om data är för långa för string_to_raw
att hantera (vilket beror på teckenuppsättningen och data men kommer att inträffa när som helst RAW
data överstiger 2000 byte), kan du lagra data i en CLOB
och konvertera det sedan till en BLOB
som du använder för att uppdatera tabellen. Det är lite mer komplext men det är mer flexibelt. I det här exemplet fyller jag ut JSON-data till 3200 tecken med en '*'-- uppenbarligen är testdatan inte längre giltig JSON men det är inte viktigt för denna fråga.
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;
/