问题
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