Oracle解析JSON字符串

news2024/12/23 22:57:02

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;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法06-搜索算法-广度优先搜索

文章目录 参考:总结大纲要求搜索算法-广度优先搜索迷宫问题问题迷宫的存储迷宫的移动搜索方式代码实现 图的广度优先遍历题目描述用邻接矩阵表示图 搜索算法-广度优先搜索 参考: 【算法设计】用C类和队列实现图搜索的广度优先遍历算法 C/C 之 广度优先…

梯度下降(Gradient Descent)

基本思想 梯度下降是一个用来求函数最小值的算法,本次,我们将使用梯度下降算法来求出代价函数的最小值。 梯度下降背后的思想是:开始时我们随机选择一个参数的组合,计算代价函数,然后我们寻找下一个能让代价函数值下降…

Linux:squid透明代理

在传统代理上进行修改并添加网卡 这次不使用手动代理,而是把网关搞成代理 在下面这个链接里的文章实验下进行修改 Linux:squid传统代理_鲍海超-GNUBHCkalitarro的博客-CSDN博客 完成以后不用再win10上去配置,代理的那一步,然后…

Python(十二)常见的数据类型

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

TabLayout+ViewPager实现滚动页面

目录 一、TabLayout介绍 二、TabLayout的常用属性和方法 常用属性: 常用方法: 三、适配器介绍 (一)、PagerAdapter介绍: (二)、FragmentPagerAdapter介绍: (三&am…

习题 1.26

我们先来看看题目要求,题目住说将 square 调用换成了(* x x),结果导致执行时间变慢。 根据以前学过的内容,我们知道 在做显示乘法的时候,是直接进行计算的,而在做函数调用的时候,是先进行表达式展开的&…

【MySQL】常见函数使用(二)

🚗MySQL学习第二站~ 🚩本文已收录至专栏:数据库学习之旅 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 就如同许多编程语言中的API一样,MySQL中的函数同样是官方给我们封装好的,可以直接调用的一段代码。…

ZooKeeper ZAB

文章首发地址 在接收到一个写请求操作后,追随者会将请求转发给群首,群首将探索性地执行该请求,并将执行结果以事务的方式对状态更新进行广播。一个事务中包含服务器需要执行变更的确切操作,当事务提交时,服务器就会将这…

dp算法篇Day7

"抱紧你的我&#xff0c;比国王富有~" 31、最长定差子序列 (1) 题目解析 从题目来看还是很容易理解的&#xff0c;就是找寻数组中构成差值相等的子序列。 (2) 算法原理 class Solution { public:int longestSubsequence(vector<int>& arr, int difference…

多模态系列论文--ALBEF 详细解析

ALBEF来自于Align before Fuse&#xff0c;作者团队全自来自于Salesforce Research。 论文地址&#xff1a;Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 论文代码&#xff1a;ALBEF 1 摘要 最近图像文本的大规模的特征学习非…

AI Chat 设计模式:7. 单例模式

本文是该系列的第七篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白和思考。 问题列表 Q.1 简单介绍一下单例模式A.1Q.2 详细说说饿汉式&#xff0c;并使用 c 举例A.2Q.3 好&#xff…

【半监督医学图像分割 2022 IJCAI】UGPCL

文章目录 【半监督医学图像分割 2022 IJCAI】UGPCL摘要1. 介绍2. 相关工作2.1 半监督医学图像分割2.2 对比学习2.3 不确定度估计 3. 方法3.1 解码器间的一致性学习3.2 不确定性引导的对比学习3.3 等变对比损失 4. 实验4.1 实验设置4.2 定量实验4.3 消融实验 5. 结论 【半监督医…

引爆用户流量,打造热门小红书创业项目

引爆用户流量&#xff0c;打造热门小红书创业项目 在当今互联网时代&#xff0c;创业者们不断寻求新的商机和盈利模式。而小红书作为一个以分享购物心得、美妆、旅行等内容为主的社交平台&#xff0c;成为了众多创业者关注的焦点。如何通过小红书引爆用户流量&#xff0c;并打造…

【框架篇】使用注解存储对象

使用注解存储对象 之前我们存储Bean时&#xff0c;需要在spring-config 中添加一行 bean注册内容才行&#xff0c;如下图所示&#xff1a; 问题引入&#xff1a;如果想在Spring 中能够更简单的进行对象的存储和读取&#xff0c;该怎么办呢&#xff1f; 问题解答&#xff1a;实…

Python应用实例(一)外星人入侵(十)

外星人入侵&#xff08;十&#xff09; 1.记分1.1 显示得分1.2 创建记分牌1.3 在外星人被消灭时更新得分1.4 重置得分1.5 将消灭的每个外星人都计入得分1.6 提高分数1.7 舍入得分1.8 最高得分1.9 显示等级1.10 显示余下的飞船数 1.记分 下面来实现一个记分系统&#xff0c;以实…

动态规划01背包之1049 最后一块石头的重量 II(第11道)

题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 。那么粉碎的可能结果如下&#xff1a; …

4029: 网格行走

题目内容 在一个 n n n \times n nn 的网格上行走&#xff0c;从 ( 1 , 1 ) (1, 1) (1,1) 走到 ( n , n ) (n, n) (n,n)。每次只能向下走一步或向右走一步。 每个点 ( i , j ) (i, j) (i,j) 有权值 a i , j a_{i, j} ai,j​&#xff0c;给定一个数 x x x&#xff0c;求…

电机驱动系列(1)--例程下载演示

电机驱动系列&#xff08;1&#xff09; 使用设备连线实操感想 使用设备 硬件&#xff1a;野火骄阳板–STM32F407IGT6&#xff0c;野火无刷电机驱动板&#xff0c;PMSM电机软件&#xff1a;MCSDK&#xff0c;STM32CubeMX&#xff0c;Keil5软件安装注意事项&#xff1a;MCSDK-F…

SOF-SLAM论文翻译

SOF-SLAM:面向动态环境的语义可视化SLAM 摘要-同时定位与绘图(SLAM)在计算机视觉和机器人领域中占有重要地位。为了便于分析&#xff0c;传统的SLAM框架采用了强静态世界假设。如何应对动态环境是一个非常重要的问题&#xff0c;越来越受到人们的关注。现有的动态场景SLAM系统…

MySQL不适合创建索引的7种情况

1. 在where中使用不到的字段&#xff0c;不要设置索引 WHERE条件&#xff08;包括order by &#xff0c;group by&#xff09; 2. 数据量小的表最好不要使用索引 表记录太少&#xff0c;比如少于1000个&#xff0c;创建索引会先查索引&#xff0c;再回表&#xff0c;查询花费…