使用 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.
我需要创建一个新的 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.