How do I return a list of values instead of a string when querying a oracle database using XPath?

坚强是说给别人听的谎言 提交于 2020-01-16 03:53:28

问题


I am using XPath to query an oracle database where the field I am querying looks like:

<!-- language: lang-xml -->
<film>
    <title>Godfather, The</title>
    <year>1972</year>
    <directors>
        <director>Francis Ford Coppola</director>
    </directors>
    <genres>
        <genre>Crime</genre>
        <genre>Drama</genre>
    </genres>
    <plot>Son of a mafia boss takes over when his father is critically wounded in a mob hit.</plot>
    <cast>
        <performer>
            <actor>Marlon Brando</actor>
            <role>Don Vito Corleone</role>
        </performer>
        <performer>
            <actor>Al Pacino</actor>
            <role>Michael Corleone</role>
        </performer>
        <performer>
            <actor>Diane Keaton</actor>
            <role>Kay Adams Corleone</role>
        </performer>
        <performer>
            <actor>Robert Duvall</actor>
            <role>Tom Hagen</role>
        </performer>
        <performer>
            <actor>James Caan</actor>
            <role>Sonny Corleone</role>
        </performer>
    </cast>
</film>

I want to return the all the actors who have starred in the film the godfather. At the minute my code looks like:

result = stmt.executeQuery("SELECT a.FILM.extract('/film[title=\"Godfather, The\"]/cast/performer/actor/text()') "
                + "FROM ASS2_Film a "
                + "WHERE a.film.existsNode('/film[title=\"Godfather, The\"]')=1");

System.out.println("\nActor");            

while (result.next()) {   
    System.out.println(result.getString(1)+"\n");
}

At the minute my code is returning:

Actor
Marlon BrandoAl PacinoDiane KeatonRobert DuvallJames Caan

Where as I want it returned as:

Actor
Marlon Brando
Al Pacino
Diane Keaton
Robert Duvall
James Caan

Thanks for any help


回答1:


EXTRACT (and EXTRACTVALUE) are deprecated functions. You should use XMLTABLE instead:

with sample_data as (select xmltype('<film>
    <title>Godfather, The</title>
    <year>1972</year>
    <directors>
        <director>Francis Ford Coppola</director>
    </directors>
    <genres>
        <genre>Crime</genre>
        <genre>Drama</genre>
    </genres>
    <plot>Son of a mafia boss takes over when his father is critically wounded in a mob hit.</plot>
    <cast>
        <performer>
            <actor>Marlon Brando</actor>
            <role>Don Vito Corleone</role>
        </performer>
        <performer>
            <actor>Al Pacino</actor>
            <role>Michael Corleone</role>
        </performer>
        <performer>
            <actor>Diane Keaton</actor>
            <role>Kay Adams Corleone</role>
        </performer>
        <performer>
            <actor>Robert Duvall</actor>
            <role>Tom Hagen</role>
        </performer>
        <performer>
            <actor>James Caan</actor>
            <role>Sonny Corleone</role>
        </performer>
    </cast>
</film>') x from dual)
select x.*
from   sample_data sd,
       xmltable('/film[title="Godfather, The"]/cast/performer' passing sd.x
                columns actor varchar2(50) path '//actor',
                        role varchar2(50) path '//role') x;

ACTOR                                              ROLE                                              
-------------------------------------------------- --------------------------------------------------
Marlon Brando                                      Don Vito Corleone                                 
Al Pacino                                          Michael Corleone                                  
Diane Keaton                                       Kay Adams Corleone                                
Robert Duvall                                      Tom Hagen                                         
James Caan                                         Sonny Corleone  

(I've included the role column just for additional info; you would just remove that column from the column list in the XMLTABLE part if you don't need to see it.)



来源:https://stackoverflow.com/questions/28838219/how-do-i-return-a-list-of-values-instead-of-a-string-when-querying-a-oracle-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!