|
如何在Oracle SQL Developer中编辑BLOB(包含JSON文本)?
6 y" O3 z% [; i我可以打开并查看它们,但是是否需要外部编辑器来编辑它们?答案非常感谢您对使用内容(即使只是记事本)及其使用方法的任何帮助。
5 D& M5 _. ] A: m0 [$ U) b$ z. f编辑:有问题的BLOB包含JSON文本。
" |- N' X; L/ C5 @% M : L" A; y `6 A8 D! }# W! f
解决方案:
& B$ Y* ^# O5 A$ w5 w1 U3 b ( [$ g2 Z- O" }) G! `4 Y
) X8 a! I c9 Z, f5 u$ g# G
8 q9 q6 M5 a7 f* c H 如果您在SQL Developer( f7 p* A+ j, R9 V) D4 a
3.1(可能还有较早的版本)中运行查询以返回BLOB,则可以双击您感兴趣的特定BLOB,在该提示下,系统将提示您尝试将数据发送到外部编辑器或尝试使内置的SQL
) b- h! l7 ]0 b& [/ Z( FDeveloper显示控件尝试将数据解释为图像或文本。如果您选择text选项,则您的JSON数据可能会正确显示。
- W* m+ T- U3 j2 C" n0 T但是,如果要更改数据,则必须发出一个UPDATE来实际设置数据。SQL Developer没有直接编辑LOB数据的功能。例如
' U/ s3 y ~ k! d& s2 v1 tUPDATE table_name: @. r# J$ R+ A4 r+ a2 ?. }0 m
SET column_with_json_data =
0 Q/ Z$ }8 q# P utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}' )
9 K) z! V" o1 Q- @4 T! q WHERE primary_key = >
, _1 O4 @+ i0 U8 q. D5 e将使用使用数据库字符集编码的新JSON数据更新指定的行。如果要将数据存储在其他字符集中,请string_to_raw使用可选的第二个参数来指定字符集。因此,如果您想使用UTF-8字符集存储数据,则可以执行以下操作
$ t) S! W1 T# RUPDATE table_name1 ~, O( k$ z V% e0 ]/ L
SET column_with_json_data = 4 e; ^% }! A2 A$ y X
utl_i18n.string_to_raw( '{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8' )
! K/ e6 g8 G0 A- {, W, b WHERE primary_key = >
% Z/ J; v4 r3 b当然,由于JSON数据是文本数据,所以最好将数据存储在旨在存储字符大对象的CLOB中。然后,SQL
! \9 u! y2 l; x/ Z$ W. KDeveloper(和其他工具)可以只显示文本,而不需要您选择结果,然后采取其他措施将其转换为文本。而且,您不必将数据转换RAW为即可更新数据库中的数据。
2 m1 U$ L7 }% O5 o" A如果数据太长而string_to_raw无法处理(取决于字符集和数据,但是在RAW数据超过2000字节时会发生),则可以将数据存储在中CLOB,然后将其转换为BLOB用于更新a的数据桌子。有点复杂,但更灵活。在此示例中,我将JSON数据填充为3200个字符,并带有’*’-显然测试数据不再是有效的JSON,但这对于此问题而言并不重要。
# B, r% p; \2 p& m m6 F$ vdeclare
" A! ^ O: i$ F l_blob blob;1 Z& n7 H& |8 P
l_clob clob := rpad('{"foo": {"id": "1", "value": "2", "name": "bob"}}',3200,'*');
5 @2 L0 v9 @0 r! |9 E8 \ l_amt integer := dbms_lob.lobmaxsize;2 r8 t1 d0 R8 O$ t/ e
l_dest_offset integer := 1;
* T t1 ~0 ]& M. f% {; Z3 ^$ C1 ^, b l_src_offset integer := 1;
: O% b$ h6 B0 m l_csid integer := dbms_lob.default_csid;; r( [/ O7 w4 Y- S0 y
l_ctx integer := dbms_lob.default_lang_ctx;) T# Q, e) f0 I4 _5 N N* i- g b
l_warn integer;
1 y) d3 l6 G" l8 z) Y% N, Fbegin
2 K% F/ `$ h& G8 P dbms_lob.createTemporary( l_blob, false );
0 W1 z4 d9 e: l+ ?" V5 }2 E dbms_lob.convertToBlob( l_blob," Y6 T3 f6 P3 u7 x D0 E; O) q! [
l_clob,& s" J; u, D, V& w
l_amt,+ c8 Y) ^* Q' F4 h+ f7 I: ^
l_dest_offset,
1 ], K2 z5 s) X. k4 S; {7 l' H9 }: ` l_src_offset,
' h& \$ y8 s( |3 U8 q& @3 k l_csid,7 I0 L2 w, B; p9 U
l_ctx,) ]( r/ b7 Y; z! c# D: A4 }
l_warn ); W% Y' u: @3 k: u9 K$ ]+ ~3 h+ D
-- You'll want to add a WHERE clause as well
. a8 X# s0 `& g; x update json_data+ E3 f G! f2 s. }* `4 l
set data = l_blob;
+ k9 {# [0 J, }# ] dbms_lob.freeTemporary( l_blob );7 w3 j6 K, n+ a7 m
end;) t5 t. ]" Z/ R! B3 D; i7 |
/ |
|