Hvis du kører en forespørgsel i SQL Developer 3.1 (og sandsynligvis tidligere udgivelser), der returnerer en BLOB, kan du dobbeltklikke på den særlige BLOB, du er interesseret i, hvor du enten vil blive bedt om at prøve at sende dataene til en ekstern editor eller for at prøve at få den indbyggede SQL Developer-visningskontrol til at forsøge at fortolke dataene som et billede eller som tekst. Dine JSON-data vil sandsynligvis blive vist korrekt, hvis du vælger tekstindstillingen.
Hvis du vil ændre dataene, bliver du dog nødt til at udstede en UPDATE
for faktisk at indstille dataene. SQL Developer har ikke funktionaliteten til direkte at redigere LOB-dataene. For eksempel
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
WHERE primary_key = <<some value>>
vil opdatere den angivne række med de nye JSON-data, der er kodet ved hjælp af databasens tegnsæt. Hvis du vil gemme dataene i et andet tegnsæt, string_to_raw
tager en valgfri anden parameter, der specificerer tegnsættet. Så hvis du vil gemme dataene ved hjælp af UTF-8-tegnsættet, ville du gøre sådan noget her
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
WHERE primary_key = <<some value>>
Selvfølgelig, da JSON-data er tekstbaserede, ville du være langt bedre stillet til at gemme dataene i en CLOB, som er designet til at gemme store karakterobjekter. Så kunne SQL Developer (og andre værktøjer) bare vise teksten i stedet for at kræve, at du vælger resultatet og derefter foretager yderligere handlinger for at konvertere det til tekst. Og du behøver ikke at konvertere dataene til RAW
for at opdatere dataene i databasen.
Hvis dataene er for lange til string_to_raw
at håndtere (hvilket afhænger af tegnsættet og dataene, men vil forekomme når som helst RAW
data overstiger 2000 bytes), kan du gemme dataene i en CLOB
og konverter det derefter til en BLOB
som du bruger til at opdatere tabellen. Det er lidt mere komplekst, men det er mere fleksibelt. I dette eksempel udfylder jeg JSON-dataene til 3200 tegn med et "*" - testdataene er naturligvis ikke længere gyldige JSON, men det er ikke vigtigt i forbindelse med dette spørgsmål.
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;
/