隨着非關系型數據大規模使用,以json格式產生的數據也出現在我所管理的Oracle數據庫的CLOB字段里面,使用過程中就需要解析出指定鍵的值。
使用了最新版本
如果Oracle版本為12.1.0.2的,數據庫直接支持SQL中解析字段中的json內容。具體使用可以參照Oracle的官方說明。
早期版本
雖然沒有原生的支持,但是可以通過安裝開源的PLJSON包實現對JSON對象的操作。整個安裝包可以從github下載。
以下步驟給出如何使用PLJSON的方式從字段的JSON內容中提取指定KEY值的VALUE。
- 創建包含json內容的表。
create table pljson_table_test (num number not null, col clob);
insert into pljson_table_test values(1,
'{"data":
{
"name": "name 1",
"description": "Cloud computing can support a company''s speed and agility, ...",
"type": "link",
"created_time": "2015-05-12T16:26:12+0000",
"shares": { "count": 1 },
"extra": "x1",
"maps" : [ true ]
}
}');
select num, name, map, count
from pljson_table_test,
table(
pljson_table.json_table( --需要解析的表
col,
pljson_varray('data.name', 'data.extra', 'data.maps', 'data.shares.count', 'data.missing'), --指定需要的解析的KEY值
pljson_varray('name', 'extra', 'map', 'count', 'whatelse')) --解析出來之后的字段別名
)
order by num
/
20180123 因回答網友問題,新增以下內容,用於處理json數組。
code:
declare
list_value json_list := json_list('[{"code":"1","status":1},{"code":"2","status":0},{"code":"3","status":0},{"code":"4","status":0}]');
code_value varchar(10);
status_value int(2);
begin
dbms_output.put_line('Count = '||list_value.count);
for i in 1 .. list_value.count
loop
code_value := pljson_ext.get_string(json(list_value.get(i)),'code');
status_value := pljson_ext.get_number(json(list_value.get(i)),'status');
dbms_output.put_line('code = ' || code_value || '; status = ' || status_value );
end loop;
end;
/
output:
Count = 4
code = 1; status = 1
code = 2; status = 0
code = 3; status = 0
code = 4; status = 0
--EOF--