Oracle创建自定义函数解析JSON字符串

 -- 1.创建一个type,返回table类型
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2(4000);
 -- 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对象{}

  --  3.创建一个函数,解析json对象{}
CREATE OR REPLACE FUNCTION parsejson(p_jsonstr varchar2, p_key varchar2)
  RETURN VARCHAR2 IS
  rtnVal    VARCHAR2(4000);
  i         NUMBER(20);
  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;

json示例:

/* DATA  = {"thir":null,"loa":"","cName":888,"contacts":[{"name": "John", "age": 30},{"name": "John1", "age": 30}]}*/
SELECT parsejson (DATA,'cName') name  FROM  JSON_DATA_1;

在这里插入图片描述
4.解析JSON数组[{},{}]

  --  4.解析JSON数组[{},{}]
create function parsearray(p_jsonstr varchar2, p_key varchar2,p_keys varchar2)
  return varchar2 is
  rtnval    varchar2(4000);
    i        number(20);
  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, ']', '');
    json := replace(json, p_keys, '');
    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, '"', '');
                json2 := replace(json2, p_keys, '');
                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 parsearray;
/


示例:

/**
 {"list":[{"name": "John", "age": 30},{"name": "John1", "age": 30}]}
 */
-- p_jsonstr 为数据, p_key 为需要的变量,p_keys 为list名称 (此处是未了替换为空)
SELECT parsearray(
               '{"list":[{"name": "John", "age": 30},{"name": "John1", "age": 30}]}',
               'name',
         '"list":') as extend1
FROM JSON_DATA_1 l;

在这里插入图片描述

  1. 字符串转list
create or replace type split_table is table of varchar2 (4000);
/**
  字符串转list
 */
create or replace function splitstr(p_string    in varchar2,
                                    p_delimiter in varchar2 := ',')
  return split_table
  pipelined as
  v_length number := length(p_string);
  v_start  number := 1;
  v_index  number;
begin
  while (v_start <= v_length) loop
    v_index := instr(p_string, p_delimiter, v_start);

    if v_index = 0 then
      pipe row(substr(p_string, v_start));
      v_start := v_length + 1;
    else
      pipe row(substr(p_string, v_start, v_index - v_start));
      v_start := v_index + 1;
    end if;
  end loop;

  return;
end splitstr;

示例:


SELECT * FROM TABLE(SPLITSTR('1,2,3', ','));

SELECT *
FROM TABLE (SPLITSTR((SELECT parsearray(
                                     '[{"name": "John", "age": 30},{"name": "John1", "age": 30}]',
                                     'name') as extend1
                      FROM JSON_DATA_1 l), ','));





在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jq1223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值