【问题标题】:Add a Virtual Column to table with XMLType column Oracle 12c向具有 XMLType 列 Oracle 12c 的表添加虚拟列
【发布时间】:2017-03-10 19:17:46
【问题描述】:

我需要创建一个新表来存储传入的 XML 消息,并计划在 create 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 ))
   );

-- 以上工作正常。

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

【问题讨论】:

  • 关于添加“常规”类型或XML类型的虚拟列的问题?
  • 它将与创建表时预定义的现有虚拟列相同,如 PolicyNumber、Effective_Date 等。
  • 作为一种解决方法,我最终创建了一个定义了“新”列的视图,因为我可以随时重新创建视图而不会丢失任何数据。仍然想知道这是否可以使用 alter table 来实现。

标签: oracle12c xmltype


【解决方案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.

【讨论】:

  • 谢谢 BobC。但看起来这将其添加为常规列而不是虚拟列?
  • 谢谢!正是我想要的。
  • NP。请考虑投票
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多