如何使用PL SQL函数从xmltype数据生成xml报告

如何使用PL SQL函数从xmltype数据生成xml报告,xml,oracle,plsql,Xml,Oracle,Plsql,我是pl/sql和xml方面的新手 <?xml version="1.0"?> <Company> <Employee> <Programmer> <Salary>2000</Salary> <Facilities> <Car>bmw</Car> <

我是pl/sql和xml方面的新手

<?xml version="1.0"?>
<Company>
    <Employee>
        <Programmer>
            <Salary>2000</Salary>
            <Facilities>
                <Car>bmw</Car>
                <Apartment>1</Apartment>
                <Bonus>2000</Bonus>
            </Facilities>
        </Programmer>
        <Manager>
            <Salary>1500</Salary>
            <Facilities>
                <Car>ford</Car>
                <Room>1</Room>
                <Bonus>1500</Bonus>
            </Facilities>
        </Manager>
    </Employee>
</Company>

因此,如何编写这样的函数。请提供帮助。谢谢您,返回部分XML文档不需要PL/SQL函数。您可以使用
XQuery
功能直接
选择XML文档的部分。这也意味着您仍然可以围绕
XQuery
SELECT
创建PL/SQL函数,如果您想隐藏查询本身:

CREATE TABLE XMLTEST (xmlcol XMLTYPE);

INSERT INTO XMLTEST (xmlcol) VALUES ('<?xml version="1.0"?>
<Company>
    <Employee>
        <Programmer>
            <Salary>2000</Salary>
            <Facilities>
                <Car>bmw</Car>
                <Apartment>1</Apartment>
                <Bonus>2000</Bonus>
            </Facilities>
        </Programmer>
        <Manager>
            <Salary>1500</Salary>
            <Facilities>
                <Car>ford</Car>
                <Room>1</Room>
                <Bonus>1500</Bonus>
            </Facilities>
        </Manager>
    </Employee>
</Company>');

COMMIT;

SELECT XMLQUERY('//Programmer' PASSING xmlcol RETURNING CONTENT)
  FROM XMLTEST;

<Programmer>
  <Salary>2000</Salary>
  <Facilities>
    <Car>bmw</Car>
    <Apartment>1</Apartment>
    <Bonus>2000</Bonus>
  </Facilities>
</Programmer>
创建表XMLTEST(xmlcol XMLTYPE);
插入XMLTEST(xmlcol)值('
2000
宝马
1.
2000
1500
河流浅水处
1.
1500
');
犯罪
选择XMLQUERY(“//程序员”传递xmlcol返回内容)
从XMLTEST;
2000
宝马
1.
2000
注意:由于QXuery表达式“//Programmer”中使用了双斜杠,上述查询将提取任何称为“程序员”的标记。如果层次结构是固定的,或者您只想检索下面列出的任何程序员,那么您必须在XQuery中相应地指定该路径:

SELECT XMLQUERY('/Company/Employee/Programmer'
                PASSING xmlcol RETURNING CONTENT)
  FROM XMLTEST;

<Programmer>
  <Salary>2000</Salary>
  <Facilities>
    <Car>bmw</Car>
    <Apartment>1</Apartment>
    <Bonus>2000</Bonus>
  </Facilities>
</Programmer>
选择XMLQUERY('/Company/Employee/Programmer'
传递(返回内容)
从XMLTEST;
2000
宝马
1.
2000

谢谢@Tim Biegeleisen。我将xml存储为xmltype列。谢谢@Tim Biegeleisen。您能给我看一些代码示例吗。谢谢您使用的是哪个版本的Oracle RDBMS?我使用的是12.1.0.2,它运行良好。在以前的版本中,您可能需要显式转换为
XMLTYPE
,请尝试在insert的周围包装一个XMLTYPE():
insert-INTO-XMLTEST(xmlcol)值(XMLTYPE(“…”)INSERT
语句抛出了一个错误,而不是XQuery。我建议你看一下文档,你应该在里面找到你需要的答案。正如我上面告诉你的,这取决于你想做什么。但由于这是一个完全不同的问题,请创建一个新的问题,并进行详细解释,包括数据模型和数据的外观。谢谢,
SELECT XMLQUERY('/Company/Employee/Programmer'
                PASSING xmlcol RETURNING CONTENT)
  FROM XMLTEST;

<Programmer>
  <Salary>2000</Salary>
  <Facilities>
    <Car>bmw</Car>
    <Apartment>1</Apartment>
    <Bonus>2000</Bonus>
  </Facilities>
</Programmer>