Sql 转换到最新的JSON_表定义-Oracle

Sql 转换到最新的JSON_表定义-Oracle,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我有下一个代码: INSERT INTO TMP_VDD_JSON VALUES ( 200, 2, 4010, '{ "Cuenta": [ { "persona": {"nombre": "Pedro", "documento": "9876543A", "fecha-naci

我有下一个代码:

INSERT INTO TMP_VDD_JSON
VALUES (
    200, 2, 4010,
    '{
        "Cuenta": [
            {
                "persona": {"nombre": "Pedro", "documento": "9876543A", "fecha-nacimiento": "02/02/1982", "ciudad": "Barcelona"}
            }
        ]
);
我想把它转换成JSON_表

SELECT jt.NOMBRE, jt.DOCUMENTO, jt.FECHA_NACIMIENTO, jt.CIUDAD
FROM TMP_VDD_JSON tmp,
JSON_TABLE(tmp.JSON_OBJ, '$.Cuenta[0].persona'
    COLUMNS (
        NOMBRE PATH '$.nombre',
        DOCUMENTO PATH '$.documento',
        **FECHA_NACIMIENTO DATE PATH '$."fecha-nacimiento",**
        CIUDAD PATH '$.ciudad'
    )) jt
主要目的是将字段FECHA_NACIMIENTOimplicit转换到JSON_表的子句中

SELECT jt.NOMBRE, jt.DOCUMENTO, jt.FECHA_NACIMIENTO, jt.CIUDAD
FROM TMP_VDD_JSON tmp,
JSON_TABLE(tmp.JSON_OBJ, '$.Cuenta[0].persona'
    COLUMNS (
        NOMBRE PATH '$.nombre',
        DOCUMENTO PATH '$.documento',
        **FECHA_NACIMIENTO DATE PATH '$."fecha-nacimiento",**
        CIUDAD PATH '$.ciudad'
    )) jt
我不想在SELECT语句中使用它! 有办法吗

有办法吗

是,如果您的日期为ISO 8601格式:

创建表tmp\u vdd\u json(
JSON_OBJ CLOB检查(JSON_OBJ是JSON)
);
插入TMP_VDD_JSON
价值观(
{“Cuenta”:[{“persona”:{
“nombre”:“Pedro”,
“文件”:“9876543A”,
“fecha Naciminto”:“1982-02-02”,
“城市”:“巴塞罗那”
}}]}'
);
然后,您的查询(如果您添加缺少的结束单报价)工作:

选择jt.NOMBRE、jt.DOCUMENTO、jt.FECHA_NACIMIENTO、jt.CIUDAD
来自TMP_VDD_JSON TMP,
JSON_表(tmp.JSON_OBJ,'$.Cuenta[0].persona'
纵队(
NOMBRE路径“$.NOMBRE”,
DOCUMENTO路径“$.DOCUMENTO”,
FECHA_Naciminto日期路径“$”FECHA Naciminto“,
CIUDAD路径“$.CIUDAD”
))jt
和产出:

名义 文件 费查乌·纳西门托 城市 佩德罗 9876543A 1982年2月2日 巴塞罗那 有办法吗

是,如果您的日期为ISO 8601格式:

创建表tmp\u vdd\u json(
JSON_OBJ CLOB检查(JSON_OBJ是JSON)
);
插入TMP_VDD_JSON
价值观(
{“Cuenta”:[{“persona”:{
“nombre”:“Pedro”,
“文件”:“9876543A”,
“fecha Naciminto”:“1982-02-02”,
“城市”:“巴塞罗那”
}}]}'
);
然后,您的查询(如果您添加缺少的结束单报价)工作:

选择jt.NOMBRE、jt.DOCUMENTO、jt.FECHA_NACIMIENTO、jt.CIUDAD
来自TMP_VDD_JSON TMP,
JSON_表(tmp.JSON_OBJ,'$.Cuenta[0].persona'
纵队(
NOMBRE路径“$.NOMBRE”,
DOCUMENTO路径“$.DOCUMENTO”,
FECHA_Naciminto日期路径“$”FECHA Naciminto“,
CIUDAD路径“$.CIUDAD”
))jt
和产出:

名义 文件 费查乌·纳西门托 城市 佩德罗 9876543A 1982年2月2日 巴塞罗那
如果数据存储在表中,则是,您需要执行选择。如果数据存储在表中,则是,您需要执行选择。因此,我没有ISO格式,我必须仅在SELECT stmt中转换?@VahramDanielyan我无法立即找到任何文档,但,在Oracle中,JSON转换为
日期
似乎只支持ISO 8601格式的日期(我选中了它,它不支持默认的
NLS\u日期格式
)。所以:no ISO format=no implicit conversion=在选择列表中执行此操作。谢谢,我认为这是不可能的。Oracle文档中有一些对ISO格式的引用,用于从SQL数据生成JSON和从JSON生成SQL值。我能找到的最接近的是这里(搜索该页面上的单词“date”;还要注意date和timestamp之间的差异):表示“必须是可以隐式转换为日期数据类型的字符值”,这意味着它将使用NLS设置。似乎是一个文档错误,它没有明确说明它只允许ISO。因此我没有ISO格式,我必须仅在SELECT stmt?@VahramDanielyan中转换。我无法立即找到任何文档说明它,但是Oracle中JSON到
日期的转换似乎只支持ISO 8601格式的日期(我选中了,但它不适用于默认的
NLS\u DATE\u格式
).So:no ISO format=no implicit conversion=在选择列表中执行此操作。谢谢,我认为这是不可能的。Oracle文档中有一些对ISO格式的引用,用于从SQL数据生成JSON和从JSON生成SQL值。我能找到的最接近的是这里(搜索“日期”一词)在该页面上;还要注意日期和时间戳之间的差异):表示“必须是可以隐式转换为日期数据类型的字符值”,这意味着它将使用NLS设置。似乎是一个文档错误,它没有明确说明它只允许ISO。