Als u een query uitvoert in SQL Developer 3.1 (en waarschijnlijk eerdere releases) die een BLOB retourneert, kunt u dubbelklikken op de specifieke BLOB waarin u geïnteresseerd bent, waar u wordt gevraagd om te proberen de gegevens naar een externe editor of om te proberen het ingebouwde SQL Developer-weergavebesturingselement de gegevens te laten interpreteren als een afbeelding of als tekst. Uw JSON-gegevens worden waarschijnlijk correct weergegeven als u de tekstoptie kiest.
Als u de gegevens echter wilt wijzigen, moet u een UPDATE
uitgeven om de gegevens daadwerkelijk in te stellen. SQL Developer heeft niet de functionaliteit om de LOB-gegevens rechtstreeks te bewerken. Bijvoorbeeld
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
WHERE primary_key = <<some value>>
zal de opgegeven rij bijwerken met de nieuwe JSON-gegevens die zijn gecodeerd met behulp van de databasetekenset. Als u de gegevens in een andere tekenset wilt opslaan, string_to_raw
neemt een optionele tweede parameter die de tekenset specificeert. Dus als je de gegevens wilt opslaan met de UTF-8-tekenset, doe je zoiets als dit
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
WHERE primary_key = <<some value>>
Omdat JSON-gegevens tekstueel zijn, kunt u de gegevens natuurlijk veel beter opslaan in een CLOB die is ontworpen om grote objecten op te slaan. Dan kan SQL Developer (en andere tools) de tekst gewoon weergeven in plaats van dat u het resultaat moet selecteren en vervolgens aanvullende acties moet ondernemen om het naar tekst te converteren. En u hoeft de gegevens niet te converteren naar RAW
om de gegevens in de database bij te werken.
Als de gegevens te lang zijn voor string_to_raw
om te verwerken (wat afhangt van de tekenset en de gegevens, maar zal optreden wanneer de RAW
gegevens groter zijn dan 2000 bytes), kunt u de gegevens opslaan in een CLOB
en zet dat vervolgens om in een BLOB
die u gebruikt om de tabel bij te werken. Dat is iets ingewikkelder, maar het is flexibeler. In dit voorbeeld vul ik de JSON-gegevens op tot 3200 tekens met een '*'-- uiteraard zijn de testgegevens niet langer geldige JSON, maar dat is niet belangrijk voor de doeleinden van deze vraag.
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;
/