使用 XMLType 列 Oracle 12c 将虚拟列添加到 table

Add a Virtual Column to table with XMLType column Oracle 12c

我需要创建一个新的 table 来存储传入的 XML 消息,并计划在 create table 语句本身中添加一些虚拟列。这很好用!我一直在搜索,但找不到改变此 table 以添加新虚拟列的方法。在 google 上搜索让我 this page

但那是从 2007 年开始的,我想知道 Oracle 12c 现在是否提供此功能。以前有人试过这个并且有什么建议吗?谢谢!

例如:

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 ))
   );

-- 以上工作正常。

现在,如果我想添加一个新的虚拟列,唯一的方法似乎是删除并重新创建 table,这可能并不容易。

看起来你可以:

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.