如何从 ORACLE 数据库中的 table 中的 JSON BLOB 字段创建视图?
How to create a View from JSON BLOB field in a table in ORACLE Database?
JSON :
{
"first": {
"JAN": {
"ID": "1",
"Name": "Jim"
}
},
"second": {
"FEB": {
"ID": "2",
"Name": "Jack"
}
},
"Idname" : "2",
"Date" : "01/28/2014",
"State" : "1"
}
我需要将 JSON 转换为 VIEW,以便我可以使用 SELECT 语句将 JSON 字段作为列访问。
我正在使用 Oracle 11g 数据库。
以下 select 查询的预期输出:
Select JAN_ID, JAN_NAME from <view name>;
给出结果:
1 Jim
JSON 函数是为数据库 Oracle12c+ 版本定义的。 APEX_JSON
应该为以前的版本安装 5.0+ 版本的包。每当安装完成时,可以使用以下代码作为解决方法以提取所需的值:
DECLARE
v_json VARCHAR2(32767);
v_mon1 OWA.VC_ARR;
v_mon2 OWA.VC_ARR;
BEGIN
SELECT *
INTO v_json
FROM j; -- your JSON value is inserted into this table
-- there's no WHERE clause assuming only one row is to be inserted
APEX_JSON.PARSE(v_json);
FOR i IN 1..2
LOOP
v_mon1(i) := TO_CHAR(TO_DATE(i, 'j'),'jspth');
v_mon2(i) := TO_CHAR(TO_DATE(i, 'mm'),'MON');
DBMS_OUTPUT.PUT_LINE(APEX_JSON.GET_VARCHAR2(v_mon1(i)||'.'||v_mon2(i)||'.ID')||' '||
APEX_JSON.GET_VARCHAR2(v_mon1(i)||'.'||v_mon2(i)||'.Name'));
END LOOP;
END;
/
如果需要创建视图,则将现有数据转换为 XMLTYPE
,然后 XMLTABLE
将列提取为
CREATE OR REPLACE VIEW v_people AS
WITH t AS
(
SELECT APEX_JSON.TO_XMLTYPE(jsdata) AS xml_data
FROM j
), t2 AS
(
SELECT xt1.*, xt2.*
FROM t
CROSS JOIN
XMLTABLE('/json/first'
PASSING xml_data
COLUMNS
ID1 INT PATH 'JAN/ID',
Name1 VARCHAR2(100) PATH 'JAN/Name'
) xt1
CROSS JOIN
XMLTABLE('/json/second'
PASSING xml_data
COLUMNS
ID2 INT PATH 'FEB/ID',
Name2 VARCHAR2(100) PATH 'FEB/Name'
) xt2
)
SELECT ID1 AS ID, Name1 AS Name FROM t2
UNION ALL
SELECT ID2, Name2 FROM t2
JSON :
{
"first": {
"JAN": {
"ID": "1",
"Name": "Jim"
}
},
"second": {
"FEB": {
"ID": "2",
"Name": "Jack"
}
},
"Idname" : "2",
"Date" : "01/28/2014",
"State" : "1"
}
我需要将 JSON 转换为 VIEW,以便我可以使用 SELECT 语句将 JSON 字段作为列访问。 我正在使用 Oracle 11g 数据库。
以下 select 查询的预期输出:
Select JAN_ID, JAN_NAME from <view name>;
给出结果:
1 Jim
JSON 函数是为数据库 Oracle12c+ 版本定义的。 APEX_JSON
应该为以前的版本安装 5.0+ 版本的包。每当安装完成时,可以使用以下代码作为解决方法以提取所需的值:
DECLARE
v_json VARCHAR2(32767);
v_mon1 OWA.VC_ARR;
v_mon2 OWA.VC_ARR;
BEGIN
SELECT *
INTO v_json
FROM j; -- your JSON value is inserted into this table
-- there's no WHERE clause assuming only one row is to be inserted
APEX_JSON.PARSE(v_json);
FOR i IN 1..2
LOOP
v_mon1(i) := TO_CHAR(TO_DATE(i, 'j'),'jspth');
v_mon2(i) := TO_CHAR(TO_DATE(i, 'mm'),'MON');
DBMS_OUTPUT.PUT_LINE(APEX_JSON.GET_VARCHAR2(v_mon1(i)||'.'||v_mon2(i)||'.ID')||' '||
APEX_JSON.GET_VARCHAR2(v_mon1(i)||'.'||v_mon2(i)||'.Name'));
END LOOP;
END;
/
如果需要创建视图,则将现有数据转换为 XMLTYPE
,然后 XMLTABLE
将列提取为
CREATE OR REPLACE VIEW v_people AS
WITH t AS
(
SELECT APEX_JSON.TO_XMLTYPE(jsdata) AS xml_data
FROM j
), t2 AS
(
SELECT xt1.*, xt2.*
FROM t
CROSS JOIN
XMLTABLE('/json/first'
PASSING xml_data
COLUMNS
ID1 INT PATH 'JAN/ID',
Name1 VARCHAR2(100) PATH 'JAN/Name'
) xt1
CROSS JOIN
XMLTABLE('/json/second'
PASSING xml_data
COLUMNS
ID2 INT PATH 'FEB/ID',
Name2 VARCHAR2(100) PATH 'FEB/Name'
) xt2
)
SELECT ID1 AS ID, Name1 AS Name FROM t2
UNION ALL
SELECT ID2, Name2 FROM t2