BEGIN;

由于之前工作上需要在oracle中做split功能以及json格分解。然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下:

1、包定义:

CREATE OR REPLACE PACKAGE PKG_COMMON IS

  -- AUTHOR  : YZCHEN
-- CREATED : 2013/11/26 14:12:43
-- PURPOSE : 公共存储过程包 /*
* AUTHOR: YZCHEN DATETIME: 2013-11-26 14:20:36
* DESC: 根据P_SEQ分割字符串,并返回数据格式,默认以,分割
*/
-- 分割后的字符串临时存储类型
TYPE TYPE_SPLIT IS TABLE OF VARCHAR2(1024);
-- 分割函数
FUNCTION FUNC_SPLIT(P_LIST VARCHAR2, P_SEP VARCHAR2 := ',')
RETURN TYPE_SPLIT
PIPELINED; /*
* AUTHOR: YZCHEN DATETIME: 2013-11-27 17:20:36
* DESC: 解析指定的JSON格式字符串
*/
-- 解析函数
FUNCTION FUNC_PARSEJSON(P_JSONSTR VARCHAR2) RETURN TYPE_SPLIT
PIPELINED; -- 解析函数,并获取指定KEY的VALUE值
FUNCTION FUNC_PARSEJSON_BYKEY(P_JSONSTR VARCHAR2, P_KEY VARCHAR2)
RETURN VARCHAR2; END PKG_COMMON;

2、包体:

CREATE OR REPLACE PACKAGE BODY PKG_COMMON IS

  /*
* @SEE DECLARETION
*/
FUNCTION FUNC_SPLIT(P_LIST VARCHAR2, P_SEP VARCHAR2 := ',')
RETURN TYPE_SPLIT
PIPELINED IS
L_IDX PLS_INTEGER;
V_LIST VARCHAR2(4000) := P_LIST;
BEGIN
LOOP
L_IDX := INSTR(V_LIST, P_SEP);
IF L_IDX > 0 THEN
PIPE ROW(SUBSTR(V_LIST, 1, L_IDX - 1));
V_LIST := SUBSTR(V_LIST, L_IDX + LENGTH(P_SEP));
ELSE
PIPE ROW(V_LIST);
EXIT;
END IF;
END LOOP;
END FUNC_SPLIT; /*
* @SEE DECLARETION
*/
FUNCTION FUNC_PARSEJSON(P_JSONSTR VARCHAR2) RETURN TYPE_SPLIT
PIPELINED IS
V_JSONSTR VARCHAR2(1000) := P_JSONSTR;
JSONKEY VARCHAR2(50);
JSONVALUE VARCHAR2(50);
JSON VARCHAR2(1000);
TEMPCHAR VARCHAR2(1);
TEMPSTR1 VARCHAR2(1000);
TEMPSTR2 VARCHAR2(1000);
CUR_JSON1 SYS_REFCURSOR;
CUR_JSON2 SYS_REFCURSOR;
BEGIN
IF V_JSONSTR IS NOT NULL THEN
-- 先去掉前面的 [ 和后面的 ] 符号
TEMPCHAR := SUBSTR(V_JSONSTR, 1, 1);
IF '[' = TEMPCHAR THEN
V_JSONSTR := SUBSTR(V_JSONSTR, 2, LENGTH(V_JSONSTR));
END IF;
TEMPCHAR := SUBSTR(V_JSONSTR, LENGTH(V_JSONSTR), 1);
IF ']' = TEMPCHAR THEN
V_JSONSTR := SUBSTR(V_JSONSTR, 1, LENGTH(V_JSONSTR) - 1);
END IF; -- 开始解析
JSON := REPLACE(V_JSONSTR, '{', '');
JSON := REPLACE(JSON, '}', '');
JSON := REPLACE(JSON, '"', '');
OPEN CUR_JSON1 FOR
SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(JSON, ','));
LOOP
FETCH CUR_JSON1
INTO TEMPSTR1;
EXIT WHEN CUR_JSON1%NOTFOUND; IF TEMPSTR1 IS NOT NULL THEN
JSONKEY := '';
JSONVALUE := '';
OPEN CUR_JSON2 FOR
SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(TEMPSTR1, ':'));
LOOP
FETCH CUR_JSON2
INTO TEMPSTR2;
EXIT WHEN CUR_JSON2%NOTFOUND;
PIPE ROW(TEMPSTR2);
END LOOP;
END IF; END LOOP;
END IF;
END FUNC_PARSEJSON; /*
* @SEE DECLARETION
*/
FUNCTION FUNC_PARSEJSON_BYKEY(P_JSONSTR VARCHAR2, P_KEY VARCHAR2)
RETURN VARCHAR2 IS
V_JSONSTR VARCHAR2(1000) := P_JSONSTR;
JSONKEY VARCHAR2(50);
JSONVALUE VARCHAR2(50);
JSON VARCHAR2(1000);
TEMPCHAR VARCHAR2(1);
TEMPSTR1 VARCHAR2(1000);
TEMPSTR2 VARCHAR2(1000);
CUR_JSON1 SYS_REFCURSOR;
CUR_JSON2 SYS_REFCURSOR;
IDX NUMBER := 0;
BEGIN
IF V_JSONSTR IS NOT NULL THEN
-- 先去掉前面的 [ 和后面的 ] 符号
TEMPCHAR := SUBSTR(V_JSONSTR, 1, 1);
IF '[' = TEMPCHAR THEN
V_JSONSTR := SUBSTR(V_JSONSTR, 2, LENGTH(V_JSONSTR));
END IF;
TEMPCHAR := SUBSTR(V_JSONSTR, LENGTH(V_JSONSTR), 1);
IF ']' = TEMPCHAR THEN
V_JSONSTR := SUBSTR(V_JSONSTR, 1, LENGTH(V_JSONSTR) - 1);
END IF; -- 开始解析
JSON := REPLACE(V_JSONSTR, '{', '');
JSON := REPLACE(JSON, '}', '');
JSON := REPLACE(JSON, '"', '');
OPEN CUR_JSON1 FOR
SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(JSON, ','));
LOOP
FETCH CUR_JSON1
INTO TEMPSTR1;
EXIT WHEN CUR_JSON1%NOTFOUND;
IDX := 0;
IF TEMPSTR1 IS NOT NULL THEN
JSONKEY := '';
JSONVALUE := '';
OPEN CUR_JSON2 FOR
SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(TEMPSTR1, ':'));
LOOP
FETCH CUR_JSON2
INTO TEMPSTR2;
EXIT WHEN CUR_JSON2%NOTFOUND;
IF IDX > 0 THEN
RETURN TEMPSTR2;
END IF;
IF TEMPSTR2 = P_KEY THEN
IDX := IDX + 1;
END IF;
END LOOP;
END IF; END LOOP;
END IF;
RETURN '';
END FUNC_PARSEJSON_BYKEY; END PKG_COMMON;

检验结果:

select * from table(pkg_common.FUNC_SPLIT('sadasd,asd,asd,s', ','));

注意: 是 from table()。 否则,会只有一条 collection 记录。

END;

--- --- --- ---> 点击查看更多最新原创博文<--- --- --- ---

技术交流

oracle split 以及 简单json解析存储过程的更多相关文章

  1. Json解析工具Jackson(简单应用)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 概述 Jackson库(http://jackson.codehaus.org),是 ...

  2. 简单的分页存储过程,Json格式日期转换为一般日期

    简单的分页存储过程 CREATE PROC Paged @pageIndex INT, @pageCount INT OUTPUT, @pageSize INT AS DECLARE @count I ...

  3. iOS开发——数据解析Swift篇&简单json数据处理

    简单json数据处理 //loadWeather var url = NSURL(string: "http://www.weather.com.cn/adat/sk/101240701.h ...

  4. android json 解析 简单示例

    1 下面是一个简单的json 解析的demo,废话不多说,直接上代码 package com.sky.gallery; import java.io.ByteArrayOutputStream; im ...

  5. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

  6. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

  7. Json解析数据的简单使用

    简单的记一下Json解析的简单实用: 使用场景:后台传到客户端的Json数据,类似于: string jsonObject="{'Name':'Jack','Age':25}"; ...

  8. 一个简单的json解析器

    实现一个简单地json解析器. 两部分组成,词法分析.语法分析 词法分析 package com.mahuan.json; import java.util.LinkedList; import ja ...

  9. Gson+GsonFormat+Postman简单粗暴解析json

    现在有时候之前的项目需要返回来修改bug看到以下这段代码 if (test != null) { JSONTokener jsonParser = new JSONTokener(test); JSO ...

随机推荐

  1. 通过DP总线实现S7-300/400与SINAMICS S120 通讯

    一.DP总线通讯功能概述 S7-300/400与SINAMICS S120 之间通过DP总线可进行周期性及非周期性数据通讯. 使用标准S7功能块SFC14/SFC15,S7-300/400PLC通过P ...

  2. 99%的人都搞错了的java方法区存储内容,通过可视化工具HSDB和代码示例一次就弄明白了

    https://zhuanlan.zhihu.com/p/269134063  番茄番茄我是西瓜 那是我日夜思念深深爱着的人啊~ 已关注   6 人赞同了该文章 前言 本篇是java内存区域管理系列教 ...

  3. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

    Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...

  4. Mybatis中的分页

    Mybatis中有哪些分页方式? 数组分页:查询出全部数据,然后再list中截取需要的部分.(逻辑分页) 优点:效率高     缺点:占用内存比较高 sql分页:只从数据库中查询当前页的数据.(物理分 ...

  5. spring 事务实现方式有哪些?

    Spring提供了编程式事务和声明式事务两种实现方式, 编程式事务允许用户在代码中精确定义事务的边界, 而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦. 简单地说,编程式事务侵入到了业务 ...

  6. String工具类之“前缀比较”StringUtils.startsWith和StringUtils.startsWithIgnoreCase

    (1)字符串以prefix为前缀(区分大小写) StringUtils.startsWith(被比较的字符串,比较字符串) 总结: 根据下面代码发现,上面的例子有部分时错误的,有可能是因为思维原因,他 ...

  7. Streamlit:快速数据可视化界面工具

    目录 Streamlit简介 Streamlit使用指南 常用命令 显示文本 显示数据 显示图表 显示媒体 交互组件 侧边栏 缓存机制 Streamlit使用Hack Streamlit的替代品 相关 ...

  8. 放大器(PA+LAN)在射频上的应用

    转自 动手又动脑才会有创造 放大器,包括两种,PA与LAN,功率放大器(PA) 和低噪声放大器(LNA),在射频上,PA用于信号的输出放大,而LNA用天线端的输入放大,一般的,LAN会比PA的放大倍数 ...

  9. 《每周一点canvas动画》——圆周运动

    接<每周一点canvas动画>--波形运动 圆周运动可以分为两种基本的形式:正圆运动和椭圆运动.在讲解圆周运动之前,必不可少的数学公式即将袭来.so,各位骚年们,请护好自己的膝盖.听不懂没 ...

  10. notification(浏览器通知)

    一.notification简介 Web Notifications是HTML5 的一个特性,目前我知道的有谷歌浏览器和windows edge对它进行了支持,用于向用户配置和显示桌面通知. 二.no ...