Проблема с заменой данных в Clob Data в Oracle - PullRequest
0 голосов
/ 28 мая 2019

моя строка ввода

Employee[10|||Aryan|||CA|||USA|||URBAN|||IT 
ENGINEER+++20|||Arjun|||FA|||USA|||RULER|||DEVELOPER]

Мой вывод должен быть

[
 {Employee Name : Aryan,Employee ID:10,Emploee Role:IT ENGINEER}
   ,
 {Employee Name : Arjun,Employee ID:20,Emploee Role:DEVELOPER}
]

Я пробовал несколько сценариев, которые не работают должным образом

Ответы [ 2 ]

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

Следующий запрос будет работать для любого количества записей.

SELECT
    '['
    || CHR(10)
    || RTRIM(XMLAGG(XMLELEMENT(E, INDVDL_ENTITY, CHR(10)
                                                 || ','
                                                 || CHR(10)).EXTRACT('//text()')
        ORDER BY
            L
    ).GETCLOBVAL(), CHR(10)
                    || ','
                    || CHR(10))
    || CHR(10)
    || ']'
FROM
    (
        SELECT
            '{Employee Name : '
            || REGEXP_SUBSTR(INDVDL_ENTITY, '[^(/|/|/|)]+', 1, 2)
            || ',Employee ID:'
            || REGEXP_SUBSTR(INDVDL_ENTITY, '[^(/|/|/|)]+', 1, 1)
            || ',Emploee Role:'
            || REGEXP_SUBSTR(INDVDL_ENTITY, '[^(/|/|/|)]+', 1, 6)
            || '}' AS INDVDL_ENTITY,
            L   AS L
        FROM
            (
                SELECT
                    REGEXP_SUBSTR(VAL, '[^\+\+\+]+', 1, LEVEL) AS INDVDL_ENTITY,
                    LEVEL   AS L
                FROM
                    (
                        SELECT
                            TRIM(TRAILING ']' FROM REGEXP_SUBSTR('Employee[10|||Aryan|||CA|||USA|||URBAN|||IT ENGINEER+++20|||Arjun|||FA|||USA|||RULER|||DEVELOPER]'
                            , '[^\[]+', 1, 2)) AS VAL
                        FROM
                            DUAL
                    )
                CONNECT BY
                    ( REGEXP_COUNT(VAL, '\+\+\+') + 1 ) >= LEVEL
            )
    );

Вывод запроса:

[
{Employee Name : Aryan,Employee ID:10,Emploee Role:IT ENGINEER}
,
{Employee Name : Arjun,Employee ID:20,Emploee Role:DEVELOPER}
]

Не стесняйтесь добавлять столько строк, сколько вы хотите в вашей входной строке. (Я также проверил его с пятью записями, он работает нормально) :):)

В соответствии с предложением Шона, создайте свое собственное форматирование с помощью функции CHR.

Спасибо.

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

Ниже написано, что вы используете версию oracle pre 12c, которая добавляет поддержку JSON.

Это не то, что вы сможете сделать с помощью простой замены.

Это должна быть функция / процедура. Чтобы дать вам некоторую идею, смотрите ниже анонимный блок, это будет просто выводить строку, вам нужно будет адаптировать ее для обновления вашего поля, если это то, что вам нужно.

Я добавил третью строку к вашей входной строке, так как first, last и строки в середине должны обрабатываться по-разному, поэтому для полного тестирования потребовалось три записи.

Примечание CHR (13) = возврат каретки, CHR (10) = перевод строки, CHR (9) = таб. Это просто попытка соответствовать вашему форматированию и может быть исключена, если точное форматирование не требуется.

declare

v_input clob default 'Employee[10|||Aryan|||CA|||USA|||URBAN|||IT ENGINEER+++20|||Arjun|||FA|||USA|||RULER|||DEVELOPER+++30|||BOB|||FA|||USA|||RULER|||DEVELOPER]';
v_line  varchar2(32000) default null;
v_output clob default null;
v_exit boolean default false;

begin

loop -- loop until we have no more employees to process
  if instr(v_input, '+++') > 0 then -- not the last line
    if v_output is null then -- first line
      v_line  := substr(v_input, instr(v_input, 'Employee[') + 9, instr(v_input, '+++') -10); -- get a single employee row (first line)
    else
      v_line  := substr(v_input, 1, instr(v_input, '+++') -1); -- get a single employee row (not fist line)
    end if;
    v_input := substr(v_input, instr(v_input, '+++') + 3); -- trim off the stuff we have already processed.
  else
    v_line := substr(v_input, 1, length(v_line) - 2); -- get a single employee row (last line)
    v_exit := true;
  end if;
  if v_output is null then -- first line
    v_output := '['||chr(13)||chr(10)||chr(9)||'{'; -- start string
  else 
    v_output := v_output || chr(9) || '{'; -- add the opening brace
  end if;
  v_output := v_output ||'Employee Name : ' || substr(v_line, instr(v_line, '|||', 1, 1) + 3, instr(v_line, '|||', 1, 2)-6) || ','; -- add name
  v_output := v_output ||'Employee ID:' || substr(v_line, 1, 2) || ','; -- add ID
  v_output := v_output ||'Employee Role:' || substr(v_line, instr(v_line, '|||', 1, 5) + 3) || '}'; -- add role
  if v_exit then -- we are on last line so close it all out and exit loop
    v_output := v_output || chr(13) || chr(10) || ']';
    exit;
  else 
    v_output := v_output || CHR(13) || CHR(10) || CHR(9) || CHR(9) || ',' || chr(13) || chr(10); -- not last line so format ready to start new line
  end if;
end loop;
dbms_output.put_line(v_output);
end;
/

Выход из этого

[
    {Employee Name : Aryan,Employee ID:10,Employee Role:IT ENGINEER}
        ,
    {Employee Name : Arjun,Employee ID:20,Employee Role:DEVELOPER}
        ,
    {Employee Name : BOB,Employee ID:30,Employee Role:DEVELOPER}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...