Добавить виртуальный столбец в таблицу со столбцом XMLType Oracle 12c

Мне нужно создать новую таблицу для хранения входящего XML-сообщения, и я планирую добавить несколько виртуальных столбцов в сам оператор создания таблицы. Это прекрасно работает! Я искал и не смог найти способ изменить эту таблицу, чтобы добавить новую виртуальную колонку. Поиск в Google позволил мне this page

Но это с 2007 года, и мне интересно, доступна ли эта функция в Oracle 12c. Кто-нибудь пробовал это раньше и есть предложения? Спасибо!

Ex:

CREATE TABLE Import_Log (message_guid varchar2(36),
                 xml_data XMLType)
  XMLTYPE xml_data STORE AS BINARY XML
  VIRTUAL COLUMNS
  (policynumber AS (XMLCast(XMLQuery('/PolicyMessage/Policy/PolicyNumber'
                               PASSING xml_data RETURNING CONTENT)
                      AS VARCHAR2(14))),
   effective_date AS (XMLCast(XMLQuery('/PolicyMessage/Policy/PolicyEffectiveDate'
                               PASSING xml_data RETURNING CONTENT)
                      AS DATE )),
   expiration_date AS (XMLCast(XMLQuery('/PolicyMessage/Policy/PolicyExpirationDate'
                               PASSING xml_data RETURNING CONTENT)
                      AS DATE ))
   );

- Вышеуказанное работает нормально.

Теперь, если я хочу добавить новый виртуальный столбец, кажется, единственный способ - отбросить и воссоздать таблицу, что может быть нелегко в будущем.


person arvindram11    schedule 10.03.2017    source источник
comment
Вопросы о добавлении виртуального столбца обычного типа или типа XML?   -  person BobC    schedule 12.03.2017
comment
Он будет таким же, как существующие виртуальные столбцы, предварительно определенные во время создания таблицы, например PolicyNumber, Effective_Date и т. Д.   -  person arvindram11    schedule 12.03.2017
comment
В качестве обходного пути я закончил тем, что создал представление с определенными новыми столбцами, поскольку я могу воссоздать представление в любое время без потери данных. Тем не менее хотелось бы знать, можно ли этого добиться с помощью alter table.   -  person arvindram11    schedule 12.03.2017


Ответы (1)


Похоже, вы можете:

SQL> CREATE TABLE Import_Log (message_guid varchar2(36),
  2                   xml_data XMLType)
  3    XMLTYPE xml_data STORE AS BINARY XML
  4    VIRTUAL COLUMNS
  5    (policynumber AS (XMLCast(XMLQuery('/PolicyMessage/Policy/PolicyNumber'
  6                                 PASSING xml_data RETURNING CONTENT)
  7                        AS VARCHAR2(14))),
  8     effective_date AS (XMLCast(XMLQuery('/PolicyMessage/Policy/PolicyEffectiveDate'
  9                                 PASSING xml_data RETURNING CONTENT)
 10                        AS DATE ))
 11  );

Table created.

SQL> 
SQL> alter table import_log
  2  add (
  3        expiration_date generated always AS (XMLCast(XMLQuery('/PolicyMessage/Policy/PolicyExpirationDate'
  4                                 PASSING xml_data RETURNING CONTENT)
  5                        AS DATE )) virtual
  6  )
  7  ;

Table altered.
person BobC    schedule 12.03.2017
comment
Спасибо, BobC. Но похоже, это добавляет его как обычный столбец, а не виртуальный? - person arvindram11; 13.03.2017
comment
Спасибо! Именно то, что я искал. - person arvindram11; 13.03.2017
comment
Н.П. Пожалуйста, рассмотрите возможность голосования - person BobC; 13.03.2017