sql >> Databasteknik >  >> RDS >> Oracle

Hur redigerar jag BLOBs (som innehåller JSON) i Oracle SQL Developer?

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


  1. teckenuppsättningar i MySQL-replikering

  2. Generera ett antal nummer i MySQL

  3. Exempel på formatering av "datetimeoffset" i SQL Server med standardformatsträngar (T-SQL)

  4. Oracle SQL:Slå samman rader till en rad