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

1、包定义:

[sql] view plaincopy
  1. CREATE OR REPLACE PACKAGE PKG_COMMON IS
  2. -- AUTHOR  : YZCHEN
  3. -- CREATED : 2013/11/26 14:12:43
  4. -- PURPOSE : 公共存储过程包
  5. /*
  6. * AUTHOR: YZCHEN  DATETIME: 2013-11-26 14:20:36
  7. * DESC: 根据P_SEQ分割字符串,并返回数据格式,默认以,分割
  8. */
  9. -- 分割后的字符串临时存储类型
  10. TYPE TYPE_SPLIT IS TABLE OF VARCHAR2(1024);
  11. -- 分割函数
  12. FUNCTION FUNC_SPLIT(P_LIST VARCHAR2, P_SEP VARCHAR2 := ',')
  13. RETURN TYPE_SPLIT
  14. PIPELINED;
  15. /*
  16. * AUTHOR: YZCHEN  DATETIME: 2013-11-27 17:20:36
  17. * DESC: 解析指定的JSON格式字符串
  18. */
  19. -- 解析函数
  20. FUNCTION FUNC_PARSEJSON(P_JSONSTR VARCHAR2) RETURN TYPE_SPLIT
  21. PIPELINED;
  22. -- 解析函数,并获取指定KEY的VALUE值
  23. FUNCTION FUNC_PARSEJSON_BYKEY(P_JSONSTR VARCHAR2, P_KEY VARCHAR2)
  24. RETURN VARCHAR2;
  25. END PKG_COMMON;

2、包体:

[sql] view plaincopy
  1. CREATE OR REPLACE PACKAGE BODY PKG_COMMON IS
  2. /*
  3. * @SEE DECLARETION
  4. */
  5. FUNCTION FUNC_SPLIT(P_LIST VARCHAR2, P_SEP VARCHAR2 := ',')
  6. RETURN TYPE_SPLIT
  7. PIPELINED IS
  8. L_IDX  PLS_INTEGER;
  9. V_LIST VARCHAR2(4000) := P_LIST;
  10. BEGIN
  11. LOOP
  12. L_IDX := INSTR(V_LIST, P_SEP);
  13. IF L_IDX > 0 THEN
  14. PIPE ROW(SUBSTR(V_LIST, 1, L_IDX - 1));
  15. V_LIST := SUBSTR(V_LIST, L_IDX + LENGTH(P_SEP));
  16. ELSE
  17. PIPE ROW(V_LIST);
  18. EXIT;
  19. END IF;
  20. END LOOP;
  21. END FUNC_SPLIT;
  22. /*
  23. * @SEE DECLARETION
  24. */
  25. FUNCTION FUNC_PARSEJSON(P_JSONSTR VARCHAR2) RETURN TYPE_SPLIT
  26. PIPELINED IS
  27. V_JSONSTR VARCHAR2(1000) := P_JSONSTR;
  28. JSONKEY   VARCHAR2(50);
  29. JSONVALUE VARCHAR2(50);
  30. JSON      VARCHAR2(1000);
  31. TEMPCHAR  VARCHAR2(1);
  32. TEMPSTR1  VARCHAR2(1000);
  33. TEMPSTR2  VARCHAR2(1000);
  34. CUR_JSON1 SYS_REFCURSOR;
  35. CUR_JSON2 SYS_REFCURSOR;
  36. BEGIN
  37. IF V_JSONSTR IS NOT NULL THEN
  38. -- 先去掉前面的 [ 和后面的 ] 符号
  39. TEMPCHAR := SUBSTR(V_JSONSTR, 1, 1);
  40. IF '[' = TEMPCHAR THEN
  41. V_JSONSTR := SUBSTR(V_JSONSTR, 2, LENGTH(V_JSONSTR));
  42. END IF;
  43. TEMPCHAR := SUBSTR(V_JSONSTR, LENGTH(V_JSONSTR), 1);
  44. IF ']' = TEMPCHAR THEN
  45. V_JSONSTR := SUBSTR(V_JSONSTR, 1, LENGTH(V_JSONSTR) - 1);
  46. END IF;
  47. -- 开始解析
  48. JSON := REPLACE(V_JSONSTR, '{', '');
  49. JSON := REPLACE(JSON, '}', '');
  50. JSON := REPLACE(JSON, '"', '');
  51. OPEN CUR_JSON1 FOR
  52. SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(JSON, ','));
  53. LOOP
  54. FETCH CUR_JSON1
  55. INTO TEMPSTR1;
  56. EXIT WHEN CUR_JSON1%NOTFOUND;
  57. IF TEMPSTR1 IS NOT NULL THEN
  58. JSONKEY   := '';
  59. JSONVALUE := '';
  60. OPEN CUR_JSON2 FOR
  61. SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(TEMPSTR1, ':'));
  62. LOOP
  63. FETCH CUR_JSON2
  64. INTO TEMPSTR2;
  65. EXIT WHEN CUR_JSON2%NOTFOUND;
  66. PIPE ROW(TEMPSTR2);
  67. END LOOP;
  68. END IF;
  69. END LOOP;
  70. END IF;
  71. END FUNC_PARSEJSON;
  72. /*
  73. * @SEE DECLARETION
  74. */
  75. FUNCTION FUNC_PARSEJSON_BYKEY(P_JSONSTR VARCHAR2, P_KEY VARCHAR2)
  76. RETURN VARCHAR2 IS
  77. V_JSONSTR VARCHAR2(1000) := P_JSONSTR;
  78. JSONKEY   VARCHAR2(50);
  79. JSONVALUE VARCHAR2(50);
  80. JSON      VARCHAR2(1000);
  81. TEMPCHAR  VARCHAR2(1);
  82. TEMPSTR1  VARCHAR2(1000);
  83. TEMPSTR2  VARCHAR2(1000);
  84. CUR_JSON1 SYS_REFCURSOR;
  85. CUR_JSON2 SYS_REFCURSOR;
  86. IDX       NUMBER := 0;
  87. BEGIN
  88. IF V_JSONSTR IS NOT NULL THEN
  89. -- 先去掉前面的 [ 和后面的 ] 符号
  90. TEMPCHAR := SUBSTR(V_JSONSTR, 1, 1);
  91. IF '[' = TEMPCHAR THEN
  92. V_JSONSTR := SUBSTR(V_JSONSTR, 2, LENGTH(V_JSONSTR));
  93. END IF;
  94. TEMPCHAR := SUBSTR(V_JSONSTR, LENGTH(V_JSONSTR), 1);
  95. IF ']' = TEMPCHAR THEN
  96. V_JSONSTR := SUBSTR(V_JSONSTR, 1, LENGTH(V_JSONSTR) - 1);
  97. END IF;
  98. -- 开始解析
  99. JSON := REPLACE(V_JSONSTR, '{', '');
  100. JSON := REPLACE(JSON, '}', '');
  101. JSON := REPLACE(JSON, '"', '');
  102. OPEN CUR_JSON1 FOR
  103. SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(JSON, ','));
  104. LOOP
  105. FETCH CUR_JSON1
  106. INTO TEMPSTR1;
  107. EXIT WHEN CUR_JSON1%NOTFOUND;
  108. IDX := 0;
  109. IF TEMPSTR1 IS NOT NULL THEN
  110. JSONKEY   := '';
  111. JSONVALUE := '';
  112. OPEN CUR_JSON2 FOR
  113. SELECT * FROM TABLE(PKG_COMMON.FUNC_SPLIT(TEMPSTR1, ':'));
  114. LOOP
  115. FETCH CUR_JSON2
  116. INTO TEMPSTR2;
  117. EXIT WHEN CUR_JSON2%NOTFOUND;
  118. IF IDX > 0 THEN
  119. RETURN TEMPSTR2;
  120. END IF;
  121. IF TEMPSTR2 = P_KEY THEN
  122. IDX := IDX + 1;
  123. END IF;
  124. END LOOP;
  125. END IF;
  126. END LOOP;
  127. END IF;
  128. RETURN '';
  129. END FUNC_PARSEJSON_BYKEY;
  130. END PKG_COMMON;

检验结果:

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

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

oracle split 以及 简单json解析存储过程相关推荐

  1. 简单json解析(org.json解析方式)

    简单json解析 json解析方式:org.json json数据 org.json依赖 ​ org.json ​ json ​ ${json.version} json解析程序 (1) 创建Vehi ...

  2. oracle大对象实例_Oracle解析复杂json的方法实例详解

    问题背景: 当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析.如此 ...

  3. mysql解析json_mysql解析简单json字符串

    很多时候,我们需要在sql里面直接解析json字符串.这里针对mysql5.7版本的分水岭进行区分. 1.对于mysql5.7以上版本 使用mysql的内置函数JSON_EXTRACT(column, ...

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

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

  5. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

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

    概述 Jackson库(http://jackson.codehaus.org),是基于Java语言的开源json格式解析工具,整个库(使用最新的2.2版本)包含3个jar包: jackson-cor ...

  7. 高手教您编写简单的JSON解析器

    编写JSON解析器是熟悉解析技术的最简单方法之一.格式非常简单.它是递归定义的,所以与解析Brainfuck相比,你会遇到轻微的挑战 ; 你可能已经使用JSON.除了最后一点之外,解析 Scheme的 ...

  8. 一个简单的json解析器

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

  9. 手写了一个简单的JSON解析器,网友直乎:牛!

    作者 | 田小波 来源 | http://r3m2u.cn/4455O 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 X ...

最新文章

  1. android 2.0 软件,Apeaksoft Android Toolkit
  2. python处理流程-在python异步协程中处理流程分析(一)
  3. python 笔记:nltk (标记英文单词词性等)
  4. 数据中心机房冷热通道优化设计经验谈
  5. CORS 跨域-同源
  6. CodeForces - 787D - Legacy(线段树优化建图+最短路)
  7. 像数据科学家一样思考:12步指南(下)
  8. 【送书福利】第一次送书活动(总共10本)
  9. 至读博客朋友的一封信
  10. iview中position: 'fixed'最顶层z-index
  11. nginx location配置直接输出文本
  12. pthread_create创建线程后是否需要释放资源
  13. 【已解决】戴尔笔记本wifi速度慢的问题。
  14. 移动端h5 下拉框 demo (原生的也太丑了把)
  15. 原型制作与图解——墨刀工具
  16. 2-1个人小程序注册
  17. 雅思阅读考点词-同义替换
  18. 旋转矩阵、欧拉角、旋转矢量及四元数的介绍和工程应用
  19. 2小时学会CSS,完成网页制作!
  20. 服务器重装系统鼠标没反应,重装系统鼠标键盘不能用怎么解决-重装系统鼠标键盘失灵的解决方法 - 河东软件园...

热门文章

  1. 酒店IPTV能做什么?
  2. ABAP 创建Rest接口实例
  3. 程序员的爱情 第十三章
  4. Python 全栈 60 天精通之路
  5. bim软件功能划分可以分为几类?用于revit的出图插件
  6. 降低node/npm 到指定版本(Mac)详细教程
  7. 纬度app:果酸焕肤是个什么原理,自己在家可以做吗?
  8. amba平台开发环境搭建
  9. Scratch与数学·概率:做一个抽奖的小程序!分享文章领书籍啦!
  10. 露天矿边坡监测系统方案