【问题标题】:Removing attributes from oracle json object从 oracle json 对象中删除属性
【发布时间】:2019-05-28 16:13:13
【问题描述】:

用例: 应用程序需要基于业务规则的属性子集

示例: 有些学生不需要输入家庭住址

数据库:甲骨文

建议的实施: 构建包含所有可能的属性命名对的 json 对象,然后选择性地删除特定的命名对

问题: 希望使用本机 oracle 函数来删除指定的命名对。 例如 json_object.remove_attribute('home_address'); 但是 Oracle 似乎没有提供任何此类方法。

解决方法:将 json_object 转换为 VARCHAR2 字符串,然后使用 INSTR 和 REPLACE 的组合删除命名对。

说明代码:

DECLARE
  CURSOR cur_student_json (p_s_ref IN VARCHAR2) IS
  SELECT  JSON_OBJECT(
       ,'s_surname'                     value s.s_surname
       ,'s_forename_1'                  value s.s_forename_1
       ,'s_home_address_1'              value s.s_home_address_1  
  RETURNING VARCHAR2 ) student_json
    FROM   students  s
   WHERE  s.s_ref = p_s_ref;

BEGIN
  FOR x IN cur_student_json (p_s_ref) LOOP
    vs_student_json:=x.student_json;  
    EXIT;
  END LOOP;  

  -- Determine student type
  vs_student_type:=get_student_type(p_s_ref);

  -- Collect list of elements not required, based on student type  
  FOR x IN cur_json_inorout(vs_student_type) LOOP   
     -- Remove element from the json
     vs_student_json:=json_remove(vs_student_json,x.attribute);
  END LOOP;
END;
/

问题: 必须有一个优雅的方法来实现需求

【问题讨论】:

    标签: json oracle


    【解决方案1】:

    在 RTFM 下分类。需要 Oracle 12.2

    DECLARE
    
      -- Declare an object of type JSON_OBJECT_T
      l_obj JSON_OBJECT_T;
    
      -- Declare cursor to build json object
      CURSOR cur_student_json (p_s_ref IN VARCHAR2) IS
      SELECT  JSON_OBJECT(
          ,'s_surname'                     value s.s_surname
          ,'s_forename_1'                  value s.s_forename_1
          ,'s_home_address_1'              value s.s_home_address_1 
        ) student_json
        FROM   students  s
       WHERE  s.s_ref = p_s_ref;
    
    BEGIN
    
      -- Initialise object
      l_obj := JSON_OBJECT_T();
    
      -- Populate the object
      FOR x IN cur_student_json (p_s_ref) LOOP
        l_obj:=JSON_OBJECT_T.parse(x.student_json); 
        EXIT;
      END LOOP;  
    
      -- Determine student type
      vs_student_type:=get_student_type(p_s_ref);
    
      -- Collect list of elements not required, based on student type  
      FOR x IN cur_json_inorout(vs_student_type) LOOP   
        -- Remove element from the json
        l_obj.remove(x.attribute);
      END LOOP;
    
      -- Display modified object
      dbms_output.put_line(l_obj.stringify);
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多