Jeśli uruchomisz zapytanie w programie SQL Developer 3.1 (i prawdopodobnie wcześniejszych wersjach), które zwraca obiekt BLOB, możesz kliknąć dwukrotnie konkretny obiekt BLOB, który Cię interesuje, gdzie zostanie wyświetlony monit o próbę wysłania danych do zewnętrznego lub spróbować, aby wbudowana kontrolka wyświetlania programu SQL Developer próbowała zinterpretować dane jako obraz lub tekst. Twoje dane JSON prawdopodobnie będą wyświetlane poprawnie, jeśli wybierzesz opcję tekstową.
Jeśli jednak chcesz zmienić dane, będziesz musiał wydać UPDATE
faktycznie ustawić dane. SQL Developer nie ma możliwości bezpośredniej edycji danych LOB. Na przykład
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
WHERE primary_key = <<some value>>
zaktualizuje określony wiersz o nowe dane JSON zakodowane przy użyciu zestawu znaków bazy danych. Jeśli chcesz przechowywać dane w innym zestawie znaków, string_to_raw
przyjmuje opcjonalny drugi parametr, który określa zestaw znaków. Więc jeśli chcesz przechowywać dane przy użyciu zestawu znaków UTF-8, zrób coś takiego
UPDATE table_name
SET column_with_json_data =
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
WHERE primary_key = <<some value>>
Oczywiście, ponieważ dane JSON są tekstowe, znacznie lepiej byłoby przechowywać dane w CLOB, który jest przeznaczony do przechowywania dużych obiektów znaków. Następnie SQL Developer (i inne narzędzia) może po prostu wyświetlić tekst, zamiast wymagać od Ciebie wybrania wyniku, a następnie podjęcia dodatkowych działań w celu przekonwertowania go na tekst. I nie musisz konwertować danych do RAW
w celu aktualizacji danych w bazie danych.
Jeśli dane są zbyt długie dla string_to_raw
do obsłużenia (co zależy od zestawu znaków i danych, ale wystąpi za każdym razem, gdy RAW
dane przekraczają 2000 bajtów), możesz przechowywać dane w CLOB
a następnie przekonwertuj to na BLOB
używanego do aktualizacji tabeli. To trochę bardziej złożone, ale bardziej elastyczne. W tym przykładzie dopełniam dane JSON do 3200 znaków znakiem „*” – oczywiście dane testowe nie są już prawidłowymi danymi JSON, ale nie jest to ważne dla celów tego pytania.
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;
/