sql >> データベース >  >> RDS >> Oracle

Oracle SQL DeveloperでBLOB(JSONを含む)を編集するにはどうすればよいですか?

    BLOBを返すSQLDeveloper3.1(およびおそらく以前のリリース)でクエリを実行する場合、関心のある特定のBLOBをダブルクリックすると、外部にデータを送信するように求められます。エディタを使用するか、組み込みのSQLDeveloperディスプレイコントロールでデータを画像またはテキストとして解釈しようとします。テキストオプションを選択すると、JSONデータが正しく表示される可能性があります。

    ただし、データを変更する場合は、UPDATEを発行する必要があります。 実際にデータを設定します。 SQL Developerには、LOBデータを直接編集する機能はありません。例

    UPDATE table_name
       SET column_with_json_data = 
              utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
     WHERE primary_key = <<some value>>
    

    データベースの文字セットを使用してエンコードされた新しいJSONデータで指定された行を更新します。データを他の文字セットで保存する場合は、string_to_raw 文字セットを指定するオプションの2番目のパラメーターを取ります。したがって、UTF-8文字セットを使用してデータを保存する場合は、次のようにします

    UPDATE table_name
       SET column_with_json_data = 
              utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
     WHERE primary_key = <<some value>>
    

    もちろん、JSONデータはテキストであるため、文字ラージオブジェクトを格納するように設計されたCLOBにデータを格納する方がはるかに優れています。その場合、SQL Developer(およびその他のツール)は、結果を選択してから追加のアクションを実行してテキストに変換するのではなく、テキストを表示するだけで済みます。また、データをRAWに変換する必要はありません。 データベース内のデータを更新するため。

    データがstring_to_rawに対して長すぎる場合 処理する(文字セットとデータによって異なりますが、RAWはいつでも発生します データが2000バイトを超える場合)、データをCLOBに保存できます。 次に、それをBLOBに変換します テーブルの更新に使用します。これはもう少し複雑ですが、より柔軟性があります。この例では、JSONデータを「*」で3200文字にパディングしています。明らかに、テストデータは有効なJSONではなくなりましたが、この質問では重要ではありません。

    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. 制約のためにデータベースを削除できません

    2. 初心者のためのSQLDELETE

    3. 1つのクエリでmysqlのさまざまなグループ化

    4. MySQL LOAD DATALOCALINFILEはODBCでは許可されていません