Как я возвращаю список значений вместо строки при запросе базы данных oracle с использованием XPath?

1

Я использую 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

Спасибо за любую помощь

Теги:
xpath

1 ответ

3
Лучший ответ

EXTRACTEXTRACTVALUE) являются устаревшими функциями. 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 если вам не нужно его видеть.)

  • 2
    Вы продолжаете избивать меня до этих * 8-) XPath может захотеть быть '/film[title="Godfather, The"]/cast/performer' хотя? Или добавьте название фильма с более сложным XPath и отфильтруйте его после объединения.
  • 0
    и вы продолжаете находить недостатки с моими ответами! * {;-) Вы, конечно, совершенно правы, как обычно! * {: - D
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню