Удаление атрибутов из объекта oracle json - PullRequest
0 голосов
/ 27 мая 2019

Вариант использования: Приложение требует подмножество атрибутов, основанных на бизнес-правилах

Пример: Некоторым студентам не требуется вводить домашний адрес

База данных: Oracle

Предлагаемая реализация: Создайте объект 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;
/

Вопрос: Должен быть элегантный метод для достижения требования

1 Ответ

0 голосов
/ 28 мая 2019

Классифицировать под 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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...