gaussdb json解析

gaussdb (GaussDB Kernel 503.1.0.SPC1200 build c28d95e9) -- 序列
CREATE SEQUENCE seq_head_id START WITH 1;
CREATE SEQUENCE seq_line_id START WITH 1;-- 头表
CREATE TABLE head_t (head_id BIGINT PRIMARY KEY DEFAULT nextval('seq_head_id'),productName VARCHAR(200) NOT NULL,price DECIMAL(10,2) NOT NULL,isActive BOOLEAN DEFAULT true,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 创建产品表
CREATE TABLE line_t (line_Id BIGINT PRIMARY KEY DEFAULT nextval('seq_line_id'),from_head_id BIGINT,demand_date TIMESTAMP,quantity  number(28,10),updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-------------------------------------------------------------------------------
-- 测试1:检查GaussDB的JSON函数支持
SELECT json_typeof('{"test": "value"}'::json) as typeof_json,json_typeof('[1,2,3]'::json) as typeof_array,('{"test": "value"}'::json)->'test' as get_value,json_array_length('[1,2,3]'::json) as array_length;-- 测试2:简化函数版本
CREATE OR REPLACE FUNCTION test_json_support() 
RETURNS INTEGER
LANGUAGE plpgsql
AS $$
DECLAREv_test_json JSON;v_result TEXT;
BEGINRAISE NOTICE '测试JSON基本功能';-- 测试1:解析JSONv_test_json := '{"insertlists": [{"name": "test"}]}'::JSON;RAISE NOTICE '测试1通过: JSON解析成功';-- 测试2:检查字段是否存在IF v_test_json->'insertlists' IS NOT NULL THENRAISE NOTICE '测试2通过: 字段检查成功';END IF;-- 测试3:检查类型v_result := json_typeof(v_test_json->'insertlists');RAISE NOTICE '测试3通过: 类型检查成功, 类型: %', v_result;RETURN 1;
EXCEPTIONWHEN OTHERS THENRAISE NOTICE '测试失败: %', SQLERRM;RETURN 0;
END;
$$;-- 运行测试
SELECT test_json_support();-------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION process_json_data_batch(json_data TEXT) 
RETURNS INTEGER
LANGUAGE plpgsql
AS $$
DECLAREv_json JSON;v_head_id BIGINT;v_elem JSON;v_update_elem JSON;v_key TEXT;v_value TEXT;v_num_value NUMERIC(28,10);i INT;j INT;v_insert_count INT := 0;v_update_count INT := 0;v_product_name TEXT;v_price DECIMAL(10,2);v_is_active BOOLEAN;v_from_head_id BIGINT;
BEGINRAISE NOTICE '=== 开始执行函数 ===';-- 解析JSONBEGINv_json := json_data::JSON;RAISE NOTICE 'JSON解析成功';EXCEPTIONWHEN OTHERS THENRAISE NOTICE 'JSON解析失败: %', SQLERRM;RETURN 0;END;BEGIN-- 处理insertlistsIF json_typeof(v_json) = 'object' THENRAISE NOTICE '开始处理insertlists';BEGINIF json_array_length(v_json->'insertlists') > 0 THENRAISE NOTICE 'insertlists数组长度: %', json_array_length(v_json->'insertlists');i := 0;WHILE i < json_array_length(v_json->'insertlists') LOOPBEGIN-- 获取数组元素v_elem := v_json->'insertlists'->i;RAISE NOTICE '处理第 % 个产品', i;-- 先提取字段值v_product_name := v_elem->>'productName';v_price := (v_elem->>'price')::DECIMAL(10,2);v_is_active := COALESCE((v_elem->>'isActive')::BOOLEAN, true);RAISE NOTICE '产品名称: %, 价格: %, 是否激活: %', v_product_name, v_price, v_is_active;-- 插入head_t表(不使用RETURNING,直接获取序列值)v_head_id := nextval('seq_head_id');INSERT INTO head_t (head_id, productName, price, isActive)VALUES (v_head_id, v_product_name, v_price, v_is_active);RAISE NOTICE '插入head_t成功, ID: %', v_head_id;v_insert_count := v_insert_count + 1;-- 处理日期字段j := 0;FOR v_key, v_value IN SELECT key, value FROM json_each_text(v_elem)LOOPIF v_key ~ '^\d{4}-\d{2}$' THENBEGINv_num_value := v_value::NUMERIC(28,10);-- 插入line_t表INSERT INTO line_t (line_id, from_head_id, demand_date, quantity)VALUES (nextval('seq_line_id'),v_head_id,(v_key || '-01')::date,v_num_value);RAISE NOTICE '插入line_t: % -> %', v_key, v_num_value;v_insert_count := v_insert_count + 1;j := j + 1;EXCEPTIONWHEN OTHERS THENRAISE NOTICE '插入line_t失败: key=%, value=%, error=%', v_key, v_value, SQLERRM;END;END IF;END LOOP;RAISE NOTICE '为该产品插入了 % 个日期记录', j;EXCEPTIONWHEN OTHERS THENRAISE NOTICE '处理产品失败: %', SQLERRM;END;i := i + 1;END LOOP;ELSERAISE NOTICE 'insertlists为空数组';END IF;EXCEPTIONWHEN OTHERS THENRAISE NOTICE '处理insertlists异常: %', SQLERRM;END;END IF;-- 处理updatelistsIF json_typeof(v_json) = 'object' THENRAISE NOTICE '开始处理updatelists';BEGINIF json_array_length(v_json->'updatelists') > 0 THENRAISE NOTICE 'updatelists数组长度: %', json_array_length(v_json->'updatelists');i := 0;WHILE i < json_array_length(v_json->'updatelists') LOOPBEGINv_update_elem := v_json->'updatelists'->i;v_from_head_id := (v_update_elem->>'from_head_id')::BIGINT;RAISE NOTICE '处理更新项, head_id: %', v_from_head_id;-- 处理日期字段j := 0;FOR v_key, v_value IN SELECT key, value FROM json_each_text(v_update_elem)LOOPIF v_key ~ '^\d{4}-\d{2}$' THENBEGINv_num_value := v_value::NUMERIC(28,10);-- 先检查记录是否存在PERFORM 1 FROM line_t WHERE from_head_id = v_from_head_id AND demand_date = (v_key || '-01')::date;IF FOUND THEN-- 更新记录UPDATE line_t SET quantity = v_num_value,updated_at = CURRENT_TIMESTAMPWHERE from_head_id = v_from_head_id AND demand_date = (v_key || '-01')::date;RAISE NOTICE '更新成功: head_id=%, date=%', v_from_head_id, v_key;v_update_count := v_update_count + 1;ELSE-- 插入新记录INSERT INTO line_t (line_id, from_head_id, demand_date, quantity)VALUES (nextval('seq_line_id'),v_from_head_id,(v_key || '-01')::date,v_num_value);RAISE NOTICE '插入成功: head_id=%, date=%', v_from_head_id, v_key;v_update_count := v_update_count + 1;END IF;j := j + 1;EXCEPTIONWHEN OTHERS THENRAISE NOTICE '更新失败: head_id=%, date=%, error=%', v_from_head_id, v_key, SQLERRM;END;END IF;END LOOP;RAISE NOTICE '为该head_id处理了 % 个日期记录', j;EXCEPTIONWHEN OTHERS THENRAISE NOTICE '处理更新项失败: %', SQLERRM;END;i := i + 1;END LOOP;ELSERAISE NOTICE 'updatelists为空数组';END IF;EXCEPTIONWHEN OTHERS THENRAISE NOTICE '处理updatelists异常: %', SQLERRM;END;END IF;RAISE NOTICE '=== 函数执行完成 ===';RAISE NOTICE '总计插入: % 条记录', v_insert_count;RAISE NOTICE '总计更新: % 条记录', v_update_count;RETURN 1;EXCEPTIONWHEN OTHERS THENRAISE NOTICE '=== 函数执行异常 ===';RAISE NOTICE '错误信息: %', SQLERRM;RAISE NOTICE '错误详情: %', SQLSTATE;RETURN 0;END;
END;
$$;------------------------------------------------------------------------------
-- 清空数据
TRUNCATE TABLE head_t CASCADE;
TRUNCATE TABLE line_t;-- 删除并重建序列
DROP SEQUENCE IF EXISTS seq_head_id cascade;
CREATE SEQUENCE seq_head_id START WITH 1;DROP SEQUENCE IF EXISTS seq_line_id cascade;
CREATE SEQUENCE seq_line_id START WITH 1;-------------------------------------------------------------------------------- 测试调用
SELECT process_json_data_batch('{"insertlists": [{"productName": "产品1","price": "12.3","2025-12": 480,"2026-01": 0,"2026-02": 480,"2026-03": 0,"2026-04": 480,"2026-05": 0,"2026-06": 56,"isActive": true},{"productName": "产品2","price": "16.3","2025-12": 482,"2026-01": 10,"2026-02": 4380,"2026-03": 0,"2026-04": 4780,"isActive": true}],"updatelists": [{"from_head_id": "1","2025-12": 485,"2026-01": 13,"2026-02": 470,"2026-03": 0,"2026-04": 47380},{"from_head_id": "2","2025-12": 4812,"2026-01": 110,"2026-02": 41380,"2026-03": 0,"2026-04": 47780}]}');[2025-12-07 15:52:03.618 CST] : [NOTICE] === 开始执行函数 ===
[2025-12-07 15:52:03.618 CST] : [NOTICE] JSON解析成功
[2025-12-07 15:52:03.618 CST] : [NOTICE] 开始处理insertlists
[2025-12-07 15:52:03.618 CST] : [NOTICE] insertlists数组长度: 2
[2025-12-07 15:52:03.618 CST] : [NOTICE] 处理第 0 个产品
[2025-12-07 15:52:03.618 CST] : [NOTICE] 产品名称: 产品1, 价格: 12.30, 是否激活: t
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入head_t成功, ID: 1
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2025-12 -> 480.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-01 -> 0.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-02 -> 480.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-03 -> 0.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-04 -> 480.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-05 -> 0.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-06 -> 56.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 为该产品插入了 7 个日期记录
[2025-12-07 15:52:03.618 CST] : [NOTICE] 处理第 1 个产品
[2025-12-07 15:52:03.618 CST] : [NOTICE] 产品名称: 产品2, 价格: 16.30, 是否激活: t
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入head_t成功, ID: 2
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2025-12 -> 482.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-01 -> 10.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-02 -> 4380.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-03 -> 0.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 插入line_t: 2026-04 -> 4780.0000000000
[2025-12-07 15:52:03.618 CST] : [NOTICE] 为该产品插入了 5 个日期记录
[2025-12-07 15:52:03.618 CST] : [NOTICE] 开始处理updatelists
[2025-12-07 15:52:03.618 CST] : [NOTICE] updatelists数组长度: 2
[2025-12-07 15:52:03.618 CST] : [NOTICE] 处理更新项, head_id: 1
[2025-12-07 15:52:03.618 CST] : [NOTICE] 更新成功: head_id=1, date=2025-12
[2025-12-07 15:52:03.618 CST] : [NOTICE] 更新成功: head_id=1, date=2026-01
[2025-12-07 15:52:03.618 CST] : [NOTICE] 更新成功: head_id=1, date=2026-02
[2025-12-07 15:52:03.618 CST] : [NOTICE] 更新成功: head_id=1, date=2026-03
[2025-12-07 15:52:03.618 CST] : [NOTICE] 更新成功: head_id=1, date=2026-04
[2025-12-07 15:52:03.618 CST] : [NOTICE] 为该head_id处理了 5 个日期记录
[2025-12-07 15:52:03.618 CST] : [NOTICE] 处理更新项, head_id: 2
[2025-12-07 15:52:03.846 CST] : [INFO] 操作影响的记录行数 : 1
[2025-12-07 15:52:03.846 CST] : [INFO] 执行时间 : 405 ms
[2025-12-07 15:52:03.846 CST] : [INFO] 执行成功... 
[2025-12-07 15:52:03.884 CST] : [NOTICE] 更新成功: head_id=2, date=2025-12
[2025-12-07 15:52:03.884 CST] : [NOTICE] 更新成功: head_id=2, date=2026-01
[2025-12-07 15:52:03.884 CST] : [NOTICE] 更新成功: head_id=2, date=2026-02
[2025-12-07 15:52:03.884 CST] : [NOTICE] 更新成功: head_id=2, date=2026-03
[2025-12-07 15:52:03.884 CST] : [NOTICE] 更新成功: head_id=2, date=2026-04
[2025-12-07 15:52:03.884 CST] : [NOTICE] 为该head_id处理了 5 个日期记录
[2025-12-07 15:52:03.884 CST] : [NOTICE] === 函数执行完成 ===
[2025-12-07 15:52:03.884 CST] : [NOTICE] 总计插入: 14 条记录
[2025-12-07 15:52:03.884 CST] : [NOTICE] 总计更新: 10 条记录------------------------------------------------------------------------------
-- 查看head_t表数据
SELECT * FROM head_t ORDER BY head_id;-- 查看line_t表数据,按产品和日期排序
SELECT h.head_id,h.productName,h.price,l.demand_date,l.quantity,l.updated_at
FROM head_t h
JOIN line_t l ON h.head_id = l.from_head_id
ORDER BY h.head_id, l.demand_date;-- 统计每个产品的记录数
SELECT h.head_id,h.productName,COUNT(l.line_id) as line_count
FROM head_t h
LEFT JOIN line_t l ON h.head_id = l.from_head_id
GROUP BY h.head_id, h.productName
ORDER BY h.head_id;

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

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

相关文章

详细介绍:python logging模块:专业日志记录

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JAX核心设计解析:函数式编程让代码更可控

很多人刚接触JAX都会有点懵——参数为啥要单独传?随机数还要自己管key?这跟PyTorch的画风完全不一样啊。 其实根本原因就一个:JAX是函数式编程而不是面向对象那套,想明白这点很多设计就都说得通了。 先说个核心区别…

20232305 2025-2026-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 1.1 学习Web前后端语言. 1.2 搭建一个简单的登录网站。 1.3 尝试对网站进行SQL注入,XSS,CSRF攻击。 2.实验过程 2.1 Web前端HTML 2.1.1 安装,启停Apache Apache是一种开源Web服务器软件,其核心功能是接…

患者投诉管理,是否正面临这些难题?

院长码上办 www.yzmsb.com医院投诉管理,是否正面临这些难题? 传统手工模式已难以满足 医院等级评审 与 患者服务提升 的双重挑战 渠道分散,数据孤岛意见箱没人投,电话记不住。投诉散落在各个角落,缺乏统一台账,极…

NOIP 游记

NOIP 游记考后光顾着玩了,给忘了 这几天一直在补文化课,12.7 号今天才有时间 因为各种原因吧,这是我学这么多年来第一篇游记 感觉有好多话要说,却不知道从何说起 感觉成绩倒是很小一部分,大多是有了很多感想 算了…

CF794E Choosing Carrot

Sol 假设 \(p=\left\lfloor\frac{n}{2}\right\rfloor\),如果没有额外操作:如果 \(n\) 是奇数,答案就是 \(\max (\min(a_{p-1},a_{p}),\min(a_{p},a_{p+1}))\)。 如果 \(n\) 是偶数,答案就是 \(\max (a_{p},a_{p+1}…

澄清:梯度下降优化的是模型参数,而非损失函数本身

澄清:梯度下降优化的是模型参数,而非损失函数本身 在深度学习的表述中,“通过梯度下降(如SGD、Adam)优化损失函数”是一个口语化的简化说法,很容易引发误解——它的真实含义并不是修改损失函数的公式或参数,而是…

用心算感受天地运行法则的气功

用心算感受天地运行法则的气功 不断幻想,在天地之间存在一个算盘,我们按照珠算口诀,在算盘上计算星球的运行轨道。星系的运行轨道,使自己感悟宇宙的运行法则。 不断幻想,在天地之间存在一个算筹,我们按照算筹的计…

一文带你搞懂 AI Agent 开发利器:LangGraph 与 LangChain 区别

https://blog.csdn.net/xxue345678/article/details/149394171https://github.com/godmaybelieve

core学习之路

定位具体错误 ID (对应恢复序列):在步骤 2 中识别出的受影响核心上(或通过安全访问指向该核心的重分发器),读取 GICR_ISERRR0 和 GICR_ISERRR1E 。任何置 1 的位均表示对应的 PPI 或 SGI 处于错误状态。清除与恢复…

XXL-JOB v3.3.1 发布 | 升级SpringBoot4、健壮性增强

XXL-JOB 正在角逐 “2025 年度Gitee最受欢迎的开源软件”,期待您投出宝贵一票,你的认可对我们很重要🌹~投票链接👉:https://gitee.com/activity/2025opensource?ident=ISLBOHRelease Notes1、【新增】新增 “…

梯度:明明是个“方向”,为啥偏叫“度”?

梯度:明明是个“方向”,为啥偏叫“度”? 提到“梯度”,很多人第一次见这个词都会犯嘀咕: 它明明是深度学习里给模型指路的“方向标”,告诉模型该往哪走才能让预测更准,怎么看都是个方向概念,为啥名字里带个“度…

苹果游戏订阅服务新增六款作品,涵盖模拟与动作冒险类型

文章介绍了苹果游戏订阅服务Apple Arcade新增的六款游戏,包括《PowerWash Simulator》和《海绵宝宝:蟹堡追逐2》等,详述了各游戏的特色和优化,并提及了服务的订阅价格和包含内容。SpongeBob and PowerWash Simulat…

U渠道:构建百万级广告甲乙方资源生态,助力行业高效对接与价值共赢

U渠道:构建百万级广告甲乙方资源生态,助力行业高效对接与价值共赢(本报讯)随着数字广告行业进入精细化运营阶段,广告主(甲方)与服务商(乙方)的高效对接需求日益迫切。作为国内广告行业头部学习与资源平台艾奇…

陪诊不是“陪跑”——北京陪诊机构调研榜出炉,三家机构凭实力登榜

周三清晨的协和医院门诊大厅,72岁的张大爷攥着老花镜和一摞检查单站在自助机前犯愁。“儿女在外地,我连取号都摸不着头脑。”话音刚落,穿蓝色工牌的陪诊师李姐已快步上前,熟练地帮他完成挂号、医保关联,还顺手把检…

深入解析:【WPF】WrapPanel的用法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

梯度下降:站在碗壁,如何找到最低点?

梯度下降:站在碗壁,如何找到最低点? 想象你站在一个巨大、光滑的陶瓷碗的内壁上。 你被蒙住眼睛,看不见碗底,也看不到碗口——但你知道:真正的目标在碗的最底部。 这,就是深度学习中“梯度下降”的核心画面。�…

牛客周赛121

A.幽幽子想吃东西每n吨获得a点满意度,最后判定一下n顿是否大于b吨决定是否要减去c的满意度即可void solve(){int a,b,c,n;cin>>a>>b>>c>>n;int ans=n*a-(n<=b)*c;cout<<ans<<…

微信小程序开发案例 | 幸运抽签小工具(上)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

学习笔记

SCHEMATA#kali安装bloodhoundcd /opt wget https://github.com/SpecterOps/BloodHound Legacy/releases/download/v4.3.1/BloodHound-linux-x64.zip unzip BloodHound-linux-x64.zip mv /opt/BloodHound-linux-x64.zi…