Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak edytować obiekty BLOB (zawierające JSON) w Oracle SQL Developer?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pula połączeń Spring JDBC i wyniki InputStream

  2. ROracle dbWriteTable tworzenie kolumn Oracle TIMESTAMP dla kolumn R DATE

  3. Włączanie TLS w R12.1

  4. Korzystanie z wielu zagnieżdżonych zapytań w Oracle DBMS

  5. Najszybszy sposób na sprawdzenie, czy jakieś rekordy w tabeli bazy danych?