Oracle解析JSON字符串

Oracle解析JSON字符串

假设某个字段存储的JSON字符串,我们不想查出来后通过一些常见的编程语言处理(JSON.parse()或者是JSONObject.parseObject()等),想直接在数据库上处理,又该如何书写呢?

其实在ORACLE中也支持多种机制去处理JSON数据,例如有操作函数JSON_ARRAY、JSON_EXISTS、JSON_VALUES、JSON_TABLE、JSON_QUERY等可以像MongoDB一样操作JSON数据。

但是一般开发中很少使用JSON操作函数,都是像其他语言一样直接解析成JSON对象或数组灵活操作数据,例如:

DECLARE
    -- 申明一个json字符串
    V_STR NVARCHAR2(1000) := '[
    { "name": "alex", "age": 15, "high": 10, "phone": 1358226000000 },
    { "name": "jan", "age": 16, "high": 92, "phone": 1358226000000 },
    { "name": "jan", "age": 17, "high": 45, "phone": 1358226000000 },
    { "name": "alex", "age": 18, "high": 87, "phone": 1358226000000 },
    { "name": "jan", "age": 15, "high": 10, "phone": 1358226060000 },
    { "name": "alex", "age": 16, "high": 87, "phone": 1358226060000 },
    { "name": "alex", "age": 17, "high": 45, "phone": 1358226060000 },
    { "name": "jan", "age": 18, "high": 92, "phone": 1358226060000 }]';
    -- 申明一个json数组变量(相当于const v_array = [])
    V_ARRAY JSON_ARRAY_T;
    -- 申明一个json对象变量(相当于const v_object = {})
    V_OBJECT JSON_OBJECT_T;
    -- 用于接收json key集合
    V_KEY_LIST JSON_KEY_LIST;
    -- 记住这几个关键字就行了,实际开发中已经够用了
BEGIN
    -- V_ARRAY := JSON_ARRAY_T(V_STR); -- 解析成json数组(这样书写也可以)
    -- 解析成json数组
    V_ARRAY := JSON_ARRAY_T.PARSE(V_STR);
    -- 遍历json数组
    FOR I IN 0 .. V_ARRAY.GET_SIZE - 1 LOOP
        -- 解析成json对象
        -- V_OBJECT := JSON_OBJECT_T.PARSE('{"A":1}'); 如果是字符串可以直接使用parse()
        V_OBJECT := JSON_OBJECT_T(V_ARRAY.GET(I));
        -- 获取 phone 属性值
        DBMS_OUTPUT.PUT_LINE('phone' || ' = ' || V_OBJECT.GET_STRING('phone'));
        -- 新增 password 属性
        V_OBJECT.PUT('password', '1');
        DBMS_OUTPUT.PUT_LINE('password' || ' = ' || V_OBJECT.GET_STRING('password'));
        -- 删除 high 属性
        V_OBJECT.REMOVE('high');
        DBMS_OUTPUT.PUT_LINE('high' || ' = ' || V_OBJECT.GET_STRING('high'));

        -- 获取json对象的 key_list
        V_KEY_LIST := V_OBJECT.GET_KEYS;
        -- 变量 key_list
        FOR KEY_INDEX IN 1 .. V_KEY_LIST.COUNT LOOP
            DBMS_OUTPUT.PUT_LINE(V_KEY_LIST(KEY_INDEX)); -- 输出 key
        END LOOP;
    END LOOP;
END;


JSON_OBJECT_TGET开头的API

在这里插入图片描述

JSON_ARRAY_TGET开头的API

在这里插入图片描述

当然两种类型的API远不止如此,用到的时候查阅一下即可。

在自定义函数上的使用示例

CREATE OR REPLACE FUNCTION YTGZHDB.FUN_GET_TDYT_NAME(TDYT IN NVARCHAR2) RETURN NVARCHAR2
AS
    V_NAME NVARCHAR2(100);
    V_KEY_LIST JSON_KEY_LIST;
    V_JSON JSON_OBJECT_T;
    V_TEMP NVARCHAR2(100);
    V_DIC_ID  VARCHAR2(50)  := '402886cb84ae206e0184be15c1590753'; -- 土地用途(后续变更调整即可)
    V_DIC_SQL VARCHAR2(255) := 'SELECT DI.F_NAME FROM YTGZHDB.DC_DIC_ITEM DI WHERE DI.F_VALUE = :1 AND DI.FK_DIC_ID = :2';
BEGIN
    V_JSON := JSON_OBJECT_T.PARSE(TDYT);
    V_KEY_LIST := V_JSON.GET_KEYS;
    FOR I IN 1 .. V_KEY_LIST.COUNT
    LOOP
        EXECUTE IMMEDIATE V_DIC_SQL INTO V_TEMP USING V_KEY_LIST(I), V_DIC_ID;
        V_NAME := CONCAT(V_NAME, CONCAT(V_TEMP, ','));
    END LOOP;
    RETURN SUBSTR(V_NAME, 1, (LENGTH(V_NAME) - 1));
END FUN_GET_TDYT_NAME;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/37749.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序api的promise化

小程序根目录cmd运行安装命令 npm install --save miniprogram-api-promise1.0.4 安装完成之后先到根目录中删除miniprogram_npm文件夹(不删除构建npm时可能会出现问题) 删除之后再在工具中点击构建npm 构建成功之后会看到根目录中重新出现了miniprogram_npm文件夹 在app.j…

RNN LSTM

参考资料: 《机器学习2022》李宏毅史上最详细循环神经网络讲解(RNN/LSTM/GRU) - 知乎 (zhihu.com) LSTM如何来避免梯度弥散和梯度爆炸? - 知乎 (zhihu.com) 1 RNN 的结构 首先考虑这样一个 slot filling 问题: 注意…

(简单)剑指Offer 21. 调整数组顺序使奇数位于偶数前面 Java

记数组nums的长度为n。从先nums左侧开始遍历,如果遇到的是奇数,就表示这个元素已经调整完成,继续从左往右遍历,直到遇到一个偶数。然后从nums右侧开始遍历,如果遇到的是偶数,就表示这个元素已经调整完成了&…

[JVM] 1. 初步认识JVM

核心思想: “Write Once, Run anywhere”. 各种语言通过编译器转换成字节码文件,在JVM上运行。 一、Java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成…

辅助驾驶功能开发-功能规范篇(27)-2-导航式巡航辅助NCA

书接上回 2.2.2.3规划控制模块 2.2.2.3.1.全局导航规划 当用户输入导航终点时,全局导航规划模块会根据高精地图的覆盖区域将全局导航路径分为ICA,NCA可用段。实现ICA/NCA功能的划分及自动升降级。 当自车未按照导航路径行驶时(如未使出指定匝道,路口未…

折叠屏手机的屏幕,华为Mate X3给出了一份“内外兼修”的解决方案

说起折叠屏手机,屏幕一直都是这个领域的重头戏,很多人都对折叠屏手机有一种刻板印象,那就是脆弱。但是,3月份华为最新推出的Mate X3可以说是非常的亮眼,在内外屏幕、水滴铰链、影像系统等多个核心部件的全方位提升&…

Python面向对象学习整理(一)

一、面向对象中的几点概念 1.1 什么是类? 类:用户定义的对象原型(prototype),该原型定义了一组可描述该类任何对象的属性,属性是数据成员(类变量 和 实例变量)和方法,可…

FPGA实验三:状态机的设计

目录 一、实验目的 二、实验要求 三、实验代码 1.design source文件部分代码 2.测试文件代码 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 (1)设计好序列检测器 (2)仿真波形(检测11010) 3…

Python爬虫实战之原神公告获取

前言 好久不见了吧,博主最近也是成为了准高三,没有太多时间去创作文章了,所以这篇文章很有可能是高考前最后一篇文章了(也不一定😉) 言归正传,本次文章主要讲解如何去爬取原神官网的公告(我不玩原神!&…

英飞凌BLDC驱动芯片替换-屹晶微

EG12521替代IR2106,NCP5106 EG2003替代IR2003 EG2103替代IR2103、IRS2003,IRS2108 EG2104替代IR2104 EG2104D替代IR2104、IR2008、IR2004 EG2104M替代IR2104、IR2008、IR2004 EG2104S替代IR2104 EG2106替代IR2106、IR2101、FAN7382、IRS2005、NCP…

使用flask开启一个简单的应用

Flask是非常流行的 Python Web框架,它能如此流行,原因主要有如下几点: 。有非常齐全的官方文档,上手非常方便。 。有非常好的扩展机制和第三方扩展环境,.工作中常见的软件都会有对应的扩展。自己动手实现扩展也很容易。 。社区活跃度非常高。…

基于springboot的智慧养老系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

less 笔记

1 margin-left 之后有 margin: 0 导致margin-left 无效 --> 不能重复定义 .btn-group {margin-left: calc(100% - 350px);display: inline-block;margin: 0; // 重复定义 导致上面 没有效果padding: 0; } 2 一定要F12检查元素 看各个div的宽度是否太长 导致靠左靠右 计算不…

[SSM]Spring6基础

目录 一、Spring启示录 1.1OCP开闭原则 1.2DIP依赖倒置原则 1.3IoC控制反转 1.4DI依赖注入 二、Spring概述 2.1Spring简介 2.2Spring八大模块 2.3Spring特点 三、Spring的入门程序 3.1Spring的文件 3.2第一个Spring程序 3.3第一个Spring程序详细剖析 3.4Spring6启…

Vue绑定class样式

效果&#xff1a;指定变换成某种颜色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{backg…

谈谈——互联网生活中的隐私保护

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

打包apk时出现Execution failed for task ‘:app:lintVitalRelease

程序可以正常运行&#xff0c;但是打包apk的时候报Execution failed for task ‘:app:lintVitalRelease导致打包失败&#xff0c;原因是执行lintVitalRelease失败了&#xff0c;存在错误。解决办法&#xff1a;在app模块的build.gradle的Android里面添加如下代码&#xff1a; l…

Nacos服务注册和配置中心(Config,Eureka,Bus)2

Nacos数据模型 Nacos领域模型,Namespace命名空间、Group分组、集群这些都是为了进行归类管理&#xff0c;把服务和配置文件进行归类&#xff0c;归类之后就可以实现一定的效果&#xff0c;比如隔离。对于服务来说&#xff0c;不同命名空间中的服务不能够互相访问调用 N…

Spring Boot 中的熔断器:原理和使用

Spring Boot 中的熔断器&#xff1a;原理和使用 什么是熔断器&#xff1f; 熔断器是一种用于处理分布式系统中故障的设计模式。它可以防止出现故障的服务对整个系统造成连锁反应。熔断器通过监控故障服务的调用情况&#xff0c;当故障服务出现问题时&#xff0c;熔断器会迅速…

MacOS使用USB接口与IPhone进行Socket通信

演示效果如下: 开源地址: GitHub - rsms/peertalk: iOS and Mac Cocoa library for communicating over USB 克隆源码: git clone https://github.com/rsms/peertalk.git 克隆后打开peertalk然后启动xcode工程 先启动MacOS服务端工程,再启动iOS客户端工程 客户端 服务端