oracle split 以及 简单json解析存储过程
2013-12-02 15:46
639 查看
BEGIN;
由于之前工作上需要在oracle中做split功能以及json格分解。然后经过一番google和优化整合,最后整理到一个存储过程包中,易于管理,代码如下:
1、包定义:
2、包体:
检验结果:
select * from table(pkg_common.FUNC_SPLIT('sadasd,asd,asd,s', ','));
注意: 是 from table()。 否则,会只有一条 collection 记录。
END;
--- --- --- ---> 点击查看更多最新原创博文<--- --- --- ---
由于之前工作上需要在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简单的存储过程以及job示例
- oracle简单的存储过程和函数以及触发器的使用
- oracle查看包存储过程,函数,以及存储过程参数,函数参数
- 一次简单的存储过程以及定时任务设置
- oracle技术之如何在存储过程中做简单动态查询(二)
- Oracle分页存储过程以及C#调用
- Oracle中的存储过程简单例子
- 简单搞一下 Oracle 存储过程动态SQL之获取查询分页!
- 简单xml解析以及Json解析
- Oracle复合类型参数的存储过程以及JDBC调用
- iOS开发JSON文件解析数据成Model的过程简单介绍
- oracle的存储过程写法以及调用,各种游标的介绍(静态,动态,sys游标的区别)
- [VB.NET]在VB.NET 2005中,如何创建Oracle的存储过程,以及如何来使用存储过程语句?
- 在命令窗口下编写Oracle存储过程并执行的简单例子
- oracle中创建存储过程,以及存储过程中调用游标
- 【传智播客郑州校区】Java,PL/SQL调用 ORACLE存储函数以及存储过程
- 简单搞一下 System.Data.OracleClient调用带blob、clob等大字段类型参数的存储过程!
- Oracle中的存储过程简单例子
- 在ORACLE的存储过程中如何做简单的动态查询