如何在Oracle SQL Developer中编辑BLOB(包含JSON)?

Xon*_*ron 9 sql oracle json blob oracle-sqldeveloper

如何在Oracle SQL Developer中编辑BLOB(包含JSON文本)?

我可以打开并查看它们,但是我需要外部编辑器来编辑它们吗?任何有关使用内容的帮助,即使只是记事本,以及如何解决它将在答案中非常感激.

编辑:有问题的BLOB包含JSON文本.

Jus*_*ave 7

如果您在SQL Developer 3.1(可能还有早期版本)中运行一个返回BLOB的查询,您可以双击您感兴趣的特定BLOB,在那里您将尝试将数据发送到外部编辑器或尝试让内置的SQL Developer显示控件尝试将数据解释为图像或文本.如果选择文本选项,您的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>>
Run Code Online (Sandbox Code Playgroud)

将使用使用数据库字符集编码的新JSON数据更新指定的行.如果要将数据存储在某些其他字符集中,请string_to_raw使用指定字符集的可选第二个参数.因此,如果您想使用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>>
Run Code Online (Sandbox Code Playgroud)

当然,由于JSON数据是文本的,因此将数据存储在用于存储字符大对象的CLOB中会更好.然后SQL Developer(和其他工具)可以只显示文本而不是要求您选择结果,然后采取其他操作将其转换为文本.而且您不必将数据转换RAW为更新数据库中的数据.

如果数据太长而string_to_raw无法处理(这取决于字符集和数据,但会在RAW数据超过2000字节时发生),您可以将数据存储在a中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;
/
Run Code Online (Sandbox Code Playgroud)


Art*_*are 5

如果您希望在无需编写任何 SQL 的情况下更改单个 blob,您可以在 Oracle SQL Developer 中执行此操作:

  1. 双击显示 的单元格(BLOB)。单元格右侧应出现一个编辑按钮(用于图标的铅笔)。点击它。
  2. 单击Download已保存数据”右侧的。把它保存在某个地方。
  3. 在您想要的任何程序中编辑文件。节省。
  4. 返回 Oracle SQL Developer 的 Edit Value 对话框,单击Local DataLoad右侧的。编辑后在保存文件的任何位置查找文件。现在单击“编辑值”对话框。OK
  5. Commit Changes如果您对更改感到满意,请单击该按钮,Rollback Changes如果您改变了主意,请单击该按钮。

我认为,dbms_lob.convertToBlob如果这只是一件快速的一次性事情,那么比做整个事情要容易得多。

  • 为什么有时“加载”链接和整个“本地数据”会话被禁用?启用这些按钮的标准是什么? (2认同)