Я использую XPath для запроса базы данных oracle, где поле, которое я запрашиваю, выглядит так:
<!-- 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>
Я хочу вернуть всех актеров, снявших в фильме крестного отца. В этот момент мой код выглядит так:
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");
}
В тот момент, когда мой код возвращается:
Actor
Marlon BrandoAl PacinoDiane KeatonRobert DuvallJames Caan
Где я хочу, чтобы он возвращался как:
Actor
Marlon Brando
Al Pacino
Diane Keaton
Robert Duvall
James Caan
Спасибо за любую помощь
EXTRACT
(и EXTRACTVALUE
) являются устаревшими функциями. XMLTABLE
этого вы должны использовать XMLTABLE
:
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
(Я включил столбец роли только для дополнительной информации, вы просто удалите этот столбец из списка столбцов в части XMLTABLE
если вам не нужно его видеть.)
'/film[title="Godfather, The"]/cast/performer'
хотя? Или добавьте название фильма с более сложным XPath и отфильтруйте его после объединения.