Oracle 12c 无法识别 JSON 类型
Posted
技术标签:
【中文标题】Oracle 12c 无法识别 JSON 类型【英文标题】:Oracle 12c does not recognize JSON type 【发布时间】:2016-03-03 23:32:41 【问题描述】:我正在研究在 oracle 中解析 JSON CLOB。我正在尝试检索和解析单个 JSON 元素。
我隔离的主要问题是编译器无法识别此处的 JSON 类型。但是,我可以在 po_document 字段(声明为 CLOB)中插入和访问单个 JSON 元素。这是我要访问的 JSON
'"PONumber" : 1600,
"Reference" : "ABULL-20140421",
"Requestor" : "Alexis Bull",
"User" : "ABULL",
"CostCenter" : "A50",
"ShippingInstructions" : "no such",
"Special Instructions" : null,
"AllowPartialShipment" : true,
"LineItems" : "no line"'
我只是拿了一个标准的 Pl/SQL 块来解析 JSON 对象:
DECLARE
vCONTENT CLOB;
v_parent_json json;
v_json_message_list json_list;
v_json_message_list_value json_value;
v_parent_json_value json_value;
BEGIN
SELECT po_document INTO vCONTENT FROM j_purchaseorder;
v_parent_json := json(vCONTENT);
v_parent_json := json(v_parent_json.get(1));
v_json_message_list := json_list(v_parent_json.get('LineItems'));
DBMS_OUTPUT.PUT_LINE(v_json_message_list.count);
for message_loop_counter in 1 ..v_json_message_list.count loop
v_parent_json_value := json(v_json_message_list.get(message_loop_counter)).get(1);
DBMS_OUTPUT.PUT_LINE(v_parent_json_value.mapname);
END LOOP;
END;
编译器日志生成错误消息:Error(3,8): PLS-00201: identifier 'JSON' must be declared
v$version 的输出: Oracle Database 12c 企业版 12.1.0.2.0 - 64 位生产 PL/SQL 版本 12.1.0.2.0 - 生产
【问题讨论】:
你从哪里得到的语法?据我从文档中看到的 JSON 值是一个字符串,所以 v_parent_json 应该是 varchar2 或 CLOB。或者您是否定义了具有该名称的对象类型? 或者您正在使用(或尝试使用)PL/JSON? 是的,我正在尝试使用 PLJSON 我的理解是 PL/JSON 是一个 Oracle 标准包,但它看起来不像一个。是否有标准的 Oracle 函数来解析 JSON,或者我的选项是否限制了正则表达式字符串并为每个 JSON 元素提取元素 PL/JSON 和 12c 的原生 JSON 是两个完全不同的东西。 PL/JSON 目前不支持 12c(官方)。不过,有些用户已经成功了——github.com/pljson/pljson/issues/28#issuecomment-187628569 【参考方案1】:我最初尝试不同的东西。我在我的问题中使用了 PL/JSON 函数,但如果我想使用 Oracle 函数,这可能是一个读取 JSON 和打印值的小演示:
declare
l_has_data_level_co BOOLEAN := FALSE; -- TRUE is for R12C
jdemo CLOB;
l_name varchar2(2000):='';
l_location varchar2(2000):='';
begin
jdemo := '"PONumber" : 1600,
"Reference" : "ABULL-20140421",
"Requestor" : "Alexis Bull",
"User" : "ABULL",
"CostCenter" : "A50",
"ShippingInstructions" : "no such",
"Special Instructions" : null,
"AllowPartialShipment" : true,
"LineItems" : "no line"';
SELECT
json_value(jdemo, '$.PONumber'),
json_value(jdemo, '$.Reference')
into
l_name,
l_location
FROM dual;
--DBMS_OUTPUT.PUT_LINE (SYSDATE||' '||jdemo);
DBMS_OUTPUT.PUT_LINE ('Name :'||l_name||' Location :'||l_location);
end;
【讨论】:
以上是关于Oracle 12c 无法识别 JSON 类型的主要内容,如果未能解决你的问题,请参考以下文章
安装oracle12c时出现无法检测指定的位置是不是位于cfs上,怎么解决
oracle 12c dbca 无法发现 asm diskgroup
Oracle 12c - 在 REST 调用中使用动态 SQL