如何通过从pl / sql中的另一个表中获取数据来创建XML类型的新表

时间:2012-11-24 13:55:43

标签: oracle plsql

这是一个名为'CARS'的示例表,它只是更大表的一部分。

MODEL              ID

Ferrari             1
Mustang             2
Taurus              3

我想创建一个名为CARS_XML的新表,将每行从CARS更改为单个XML类型 列,使用游标从表CARS中获取数据(而不是插入每行的值)以形成新表CARS_XML。结果表包含CARMODELID的XML标记,第一个表CARS的值插入XML标记内的正确位置,以便选择来自CARS_XML的*将如下所示:

< CAR>< MODEL>Ferrari< /MODEL>< ID>1< /ID>< /MODEL>< /CAR>
< CAR>< MODEL>Mustang< /MODEL>< ID>2< /ID>< /MODEL><  /CAR>
< CAR>< MODEL>Taurus< /MODEL>< ID>3< /ID>< /MODEL>< /CAR>

首先,我是否声明sys.xmltype并定义它,如果是,我该怎么做?

2 个答案:

答案 0 :(得分:3)

为什么您希望将xml放在另一个表格中,而不是在需要时从xml表格生成CARS

我之所以这样说是因为CARS表有来自另一个表的约束。你需要在该CAR_XML上复制以保持一致性。

另一个原因是,无论何时将数据插入CARS表,都需要将其插入CAR_XML。所以编写一个函数,从FLY上的CARS表中获取数据。 如果没有,请在CARS表上创建一个触发器,在insert update delete上,它在CAR_XML表上执行相同的操作。

create table cars(model varchar2(200),id number);
insert into cars values('Ferrari',1);
insert into cars values('Mustang',2);
insert into cars values('Taurus',3);


SELECT XMLElement("CAR", 
                        XMLElement("MODEL",c.model) ,
                        XMLElement("ID", c.id)
                 ) AS "RESULT" 
FROM cars c;

输出

< CAR>< MODEL>Ferrari< /MODEL>< ID>1< /ID>< /MODEL>< /CAR>
< CAR>< MODEL>Mustang< /MODEL>< ID>2< /ID>< /MODEL><  /CAR>
< CAR>< MODEL>Taurus< /MODEL>< ID>3< /ID>< /MODEL>< /CAR>

答案 1 :(得分:1)

我认为下面的脚本会做你想要的,虽然我无法完全检查。然而,你想要做的似乎是有问题的。大概在未来的某个时候你将把这个xml发送到某个地方,对我来说,将数据转换为xml的最佳时间就是当你想要发送它时,而不是将它留在表中,占用你的空间数据库。您现在在两个不同的地方也拥有相同的数据,这通常是数据库设计中的一件坏事。

CREATE TABLE cars
(model varchar2(30)
,id   number(3));

INSERT INTO cars
(model
,id)
VALUES ( 'Ferrari',1);

INSERT INTO cars
(model
,id)
VALUES ( 'Mustang',2);


INSERT INTO cars
(model
,id)
VALUES ( 'Taurus',3);

CREATE TABLE cars_xml
(xml_data xmltype);


INSERT INTO cars_xml
SELECT xmlelement("CAR",xmlelement("MODEL",c.model)||xmlelement("ID",c.id))
FROM cars c;