如何在Oracle SQL Developer中编辑BLOB(包含JSON文本)?
我可以打开并查看它们,但是我需要外部编辑器来编辑它们吗?任何有关使用内容的帮助,即使只是记事本,以及如何处理它都会在答案中得到极大的赞赏。
编辑:有问题的BLOB包含JSON文本。
答案 0 :(得分: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>>
将使用数据库字符集编码的新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>>
当然,由于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)
如果您希望更改单个Blob而不必编写任何SQL,则可以在Oracle SQL Developer中进行以下操作:
(BLOB)
的单元格。编辑按钮(图标铅笔)应出现在单元格的右侧。点击它。Download
。将其保存在某个地方。Load
。编辑后将文件保存到任何位置均可找到该文件。立即在“编辑值”对话框中单击OK
。Commit Changes
按钮;如果您改变主意,请单击Rollback Changes
按钮。如果这只是一件一次性的事情,我想比做整个dbms_lob.convertToBlob
要容易得多。