oracle split 以及 简单json解析存储过程

原创 2013年12月02日 15:46:03

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;

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

数据库中生成JSON数据的存储过程

  • 2014年07月31日 10:13
  • 4KB
  • 下载

Oracle解析json字符串 获取指定值自定义函数代码

http://www.oschina.net/code/snippet_1162040_48289 [1].[代码] ty_tbl_str_split 跳至 [1] [2] [3...
  • e_wsq
  • e_wsq
  • 2016年03月07日 14:06
  • 2585

Oracle 中解析Json数据 PLJson的安装及使用

将数据以json的格式传到数据库中,那么怎么解析呢?有办法,需要用到一个 PLJSON 的开源项目 下载下来安装 https://github.com/pljson/pljson安装方法:下载后,...
  • cctvcqupt
  • cctvcqupt
  • 2017年03月16日 03:10
  • 3471

存储过程解析表菜单并输出JSON格式字符串

存储过程解析表菜单并输出JSON格式字符串,可用来实现权限菜单控制。
  • 5653325
  • 5653325
  • 2014年10月09日 16:56
  • 3988

PLSQL中json使用

json 格式(输入为数组) { “Item_IDs”:[1,1] } PROCEDURE proc_item_delete(p...
  • wang_zhong_cheng
  • wang_zhong_cheng
  • 2017年08月11日 16:47
  • 614

ORACLE PLSQL解析JSON

ORACLE PLSQL解析JSON下载pljson 地址:https://github.com/pljson/pljson 打开command window 执行:SQL> @C:\plj...
  • GoodLuckToThePole
  • GoodLuckToThePole
  • 2017年07月10日 16:32
  • 843

plsql解析json

  • 2016年03月03日 10:48
  • 257KB
  • 下载

Oracle 12.1.0.2 对JSON的支持

Oracle 12.1.0.2版本有一个新功能就是可以存储、查询、索引JSON数据格式,而且也实现了使用SQL语句来解析JSON,非常方便。...
  • linghe301
  • linghe301
  • 2015年01月30日 09:11
  • 14492

oracle 解析JSON字符串

---------------------- --  解析JSON字符串  -- ---------------------- --p_jsonstr json字符串 --p_key 键 --返回p_...
  • qiruiduni
  • qiruiduni
  • 2013年11月04日 14:04
  • 4895

Oracle JSON 字符串处理实例

--从JSONArray中取数据 SELECT jt.* FROM JSON_TABLE('[ { "device_type_id": 1, ...
  • e_wsq
  • e_wsq
  • 2017年03月03日 21:21
  • 2069
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle split 以及 简单json解析存储过程
举报原因:
原因补充:

(最多只允许输入30个字)