oracle 11g 版本之前,创建自定义函数--解析JSON字符串.sql
2020年12月18日 周五 09:22 (北京) 晴 0℃~-9℃ 3-4级转<3级风
---1.创建一个type,返回table类型 CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2(6000); / ---2.创建一个分割的函数,主要对json进行按照固定割串分割 CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN ty_str_split IS j INT := 0; i INT := 1; len INT := 0; len1 INT := 0; str VARCHAR2 (4000); str_split ty_str_split := ty_str_split (); BEGIN len := LENGTH (p_str); len1 := LENGTH (p_delimiter);
WHILE j < len LOOP j := INSTR (p_str, p_delimiter, i);
IF j = 0 THEN j := len; str := SUBSTR (p_str, i); str_split.EXTEND; str_split (str_split.COUNT) := str;
IF i >= len THEN EXIT; END IF; ELSE str := SUBSTR (p_str, i, j - i); i := j + len1; str_split.EXTEND; str_split (str_split.COUNT) := str; END IF; END LOOP;
RETURN str_split; END fn_split; / ---3.再创建一个函数,解析json对像{} CREATE OR REPLACE FUNCTION parsejson(p_jsonstr varchar2, p_key varchar2) RETURN VARCHAR2 IS rtnVal VARCHAR2(4000); i NUMBER(2); jsonkey VARCHAR2(4000); jsonvalue VARCHAR2(4000); json VARCHAR2(4000); BEGIN IF p_jsonstr IS NOT NULL THEN json := REPLACE(p_jsonstr, '{', ''); json := REPLACE(json, '}', ''); json := replace(json, '"', ''); FOR temprow IN (SELECT * FROM TABLE(fn_split(json, ','))) LOOP IF temprow.column_value IS NOT NULL THEN i := 0; jsonkey := ''; jsonvalue := ''; FOR tem2 IN (SELECT * FROM TABLE(fn_split(temprow.column_value, ':'))) LOOP IF i = 0 THEN jsonkey := tem2.column_value; END IF; IF i = 1 THEN jsonvalue := tem2.column_value; END IF; i := i + 1; END LOOP; IF (jsonkey = p_key) THEN rtnVal := jsonvalue; END if; END IF; END LOOP; END IF; RETURN rtnVal; END parsejson; / ---4 解析JSON数组[{},{}] CREATE OR REPLACE FUNCTION parsejsontwo(p_jsonstr varchar2, p_key varchar2) RETURN VARCHAR2 IS rtnVal VARCHAR2(4000); i NUMBER(2); jsonkey VARCHAR2(4000); jsonvalue VARCHAR2(4000); json VARCHAR2(4000); json2 VARCHAR2(4000); BEGIN IF p_jsonstr IS NOT NULL THEN json := REPLACE(p_jsonstr, '[', ''); json := REPLACE(json, ']', ''); FOR temprow IN (SELECT * FROM TABLE(fn_split(json, ','))) LOOP IF temprow.column_value IS NOT NULL THEN json2 := REPLACE(temprow.column_value, '{', ''); json2 := REPLACE(json2, '}', ''); json2 := replace(json2, '"', ''); FOR temprow2 IN (SELECT * FROM TABLE(fn_split(json2, ','))) LOOP i:=0; jsonkey:= ''; jsonvalue:= ''; FOR tmpe2 IN (SELECT * FROM TABLE(fn_split(temprow2.column_value, ':'))) LOOP IF i = 0 THEN jsonkey := tmpe2.column_value; END IF; IF i = 1 THEN jsonvalue := tmpe2.column_value; END IF; i := i + 1; END LOOP; IF (jsonkey = p_key) THEN IF rtnVal IS NOT NULL THEN rtnVal :=rtnVal||','||jsonvalue; ELSE rtnVal :=jsonvalue; END IF; END if; END LOOP; END IF; END LOOP; END IF; RETURN rtnVal; END parsejsontwo; / -----示例: -- SELECT parsejsontwo('[{"applyno":792,"extend1":"2019-WT-280","customerpart":"xxx","contactman":"茆XX","projectname":"XXXXX","projecttype":"XXX样"},{"applyno":793,"extend1":"2019-WT-281","customerpart":"江苏XXX集团有限公司","contactman":"茆XX","projectname":"XX区XX镇延XX大道南侧XX路XX地块","projecttype":"XXX量"}]','extend1') as extend1 FROM dual;
|
|
相关文章
- Oracle SQL
- Oracle对没有主键的表分页
- oracle创建HR示例数据库脚本hr_main.sql分享
- Linux服务器下oracle数据库启动服务操作步骤
- Oracle中模拟SQL中的isnull函数
- Oracle数据库:oracle数据表格dmp,sql,pde格式导入与导出,视图、序列、索引等对象的导出,oracle完结,后续开启mysql的学习
- Oracle ASM 翻译系列第六弹:高级知识 如何映射asmlib管理的盘到它对应的设备名
- Oracle SQL中实现indexOf和lastIndexOf功能
- Oracle字符串连接的方法
- 【专解】Oracle中GROUP BY的用法
- Windos系统用PL/SQL Developer软件进行Oracle数据库备份/迁移
- 《Oracle SQL疑难解析》——1.9 从表中删除不需要的行
- 《Oracle SQL疑难解析》——1.16 基于条件的插入或修改
- 《SQL初学者指南(第2版)》——1.2 Microsoft SQL Server、MySQL和Oracle
- JDBC连接Oracle数据库的示例代码
- oracle 识别’低效执行’的SQL语句
- 转: oracle 存储过程 执行动态 实现sql
- oracle与mysql与sqlserver的分页
- 《高并发Oracle数据库系统的架构与设计》一2.6 本章小结
- Oracle Profile 使用详解--zhuanzai
- oracle多表查询
- oracle sql生成临时递增数据
- Oracle-PL/SQL编程