SQL - вставлять из одной таблицы в другую, но манипулировать данными - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь скопировать данные из одной таблицы в другую с помощью следующего сценария:

insert into test_report
( company_id
, report_id
, brch_code
, definition
, description
, editable_flag
, executable_flag
, name
, report_type ) 
values
( 2420
, 'RP00002004'
, '0001'
, (select definition from test_template_report where template_id='RP00001242')
, (select description from test_template_report where template_id='RP00001242')
, (select editable_flag from test_template_report where template_id='RP00001242')
, (select executable_flag from test_template_report where template_id='RP00001242')
, (select name from test_template_report where template_id='RP00001242')
, '01' );

Это работает нормально, но поле определения содержит XML, который необходимо немного изменить.

Следующее является частью данных определения:

<listdef page='25'><reportId>RP00000390</reportId><name>Fund Transfer</name><description>Fund Transfer</description>

Необходимо изменить часть <reportId>RP00000390</reportId> на RP00002004 согласно вставке в скрипт.

Например:

<listdef page='25'><reportId>RP00002004</reportId><name>Fund Transfer</name><description>Fund Transfer</description>

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Функция replace заменяет одну текстовую строку другой, поэтому вы можете изменить

definition

на

replace(definition, '<reportId>RP00000390</reportId>', '<reportId>RP00002004</reportId>')

Вы также можете получить всестолбцы, которые вам нужны от test_template_report за один раз:

insert into test_report
     ( company_id
     , report_id
     , brch_code
     , definition
     , description
     , editable_flag
     , executable_flag
     , name
     , report_type )
select 2420
     , 'RP00002004'
     , '0001'
     , replace(tr.definition, '<reportId>RP00000390</reportId>', '<reportId>RP00002004</reportId>')
     , tr.description
     , tr.editable_flag
     , tr.executable_flag
     , tr.name
     , '01'
from   test_template_report tr
where  tr.template_id = 'RP00001242';

Если вы хотите заменить любое значение reportIf, а не только 'RP00000390', вы можете использовать regexp_replace:

insert into test_report
     ( company_id
     , report_id
     , brch_code
     , definition
     , description
     , editable_flag
     , executable_flag
     , name
     , report_type )
select 2420
     , 'RP00002004'
     , '0001'
     , regexp_replace(definition,'<reportId>[^<]+</reportId>','<reportId>RP00002004</reportId>')
     , tr.description
     , tr.editable_flag
     , tr.executable_flag
     , tr.name
     , '01'
from   test_template_report tr
where  tr.template_id = 'RP00001242';
0 голосов
/ 13 июня 2018

Вы можете использовать XMLQuery с modify ... replace value of node:

insert into test_report (company_id,report_id,brch_code,definition,description,
  editable_flag,executable_flag,name,report_type)
select 2420, 'RP00002004', '0001',
  XMLQuery('copy $i := $d modify
      (for $j in $i//reportId return replace value of node $j with $r)
      return $i'
    passing definition as "d", 'RP00002004' as "r"
    returning content),
  description, editable_flag, executable_flag, name, '01'
from test_template_report where template_id='RP00001242';

Вам не нужны все отдельные выборки из таблицы шаблонов, для этого достаточно одного вставки-выбора.

Манипулирование XML предполагает, что definition является XMLType;если это не так, вы можете преобразовать его в единицу в предложении passing, то есть passing XMLType(definition) as "d".Значение узла * (1010) * (или узлов) заменяется строкой, переданной как "r".

В качестве быстрой статической демонстрации этой замены, с XML, предоставленным в виде строкового литерала.:

select
  XMLQuery('copy $i := $d modify
      (for $j in $i//reportId return replace value of node $j with $r)
      return $i'
    passing XMLType(q'[<listdef page='25'><reportId>RP00000390</reportId><name>Fund Transfer</name><description>Fund Transfer</description></listdef>]') as "d",
      'RP00002004' as "r"
    returning content)
  as modified_definition
from dual;

MODIFIED_DEFINITION                                                                                                           
------------------------------------------------------------------------------------------------------------------------------
<listdef page="25"><reportId>RP00002004</reportId><name>Fund Transfer</name><description>Fund Transfer</description></listdef>

Подробнее .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...