ВЫБЕРИТЕ Значения из Varray ORACLE SQL

Я использую apex.oracle и получаю ошибку [unsupported data type], Объяснение: у меня есть таблица с именем Playlist, и я хочу сохранить массив песен в Songs поле. По этой причине я определил тип с именем PlaylistSongs из varray из chars, Вставка работает, но когда я делаю SELECT, я получаю [unsupported data type] вместо моего массива со значениями.

Вот код

CREATE OR REPLACE TYPE PlaylistSongs AS VARRAY(4) OF CHAR(16);

CREATE TABLE PLAYLIST (
    IDPlaylist              NUMBER(4) NOT NULL,
    PlaylistName            CHAR(64),
    PlaylistAuthor          NUMBER(2),
    PlaylistDuration        NUMBER,
    ActivePlaylist          NUMBER(1),
    Songs                   PlaylistSongs,

    CONSTRAINT PLAYLIST_PRIMARY_KEY PRIMARY KEY (IDPlaylist),
    CONSTRAINT PLAYLIST_FOREIGN_KEY FOREIGN KEY (PlaylistAuthor) REFERENCES DJ (IDDJ)
);

INSERT INTO PLAYLIST VALUES (1, 'Rap', 1, 153, 1, 1, PlaylistSongs('River', 'Lose Yourself', 'Till I Collapse', 'Walk On Water')); 

После небольшого исследования я нашел TABLE оператор.

SELECT *
FROM PLAYLIST p, TABLE(p.Songs) ps

Это работает, но вместо того, чтобы отображать массив как обычный массив, он отображает каждую запись в новой строке.

Мне нужно, чтобы это выглядело как ['River', 'Lose Yourself', 'Till I Collapse', 'Walk On Water'], Это можно сделать?

1 ответ

Решение

Да - посмотри listagg()агрегатная функция (идет сgroup byпункт):

select idplaylist
     , playlistname
     , playlistauthor
     , playlistduration
     , activeplaylist
     , listagg(rtrim(ps.column_value), ', ') within group (order by ps.column_value) as songs
from   playlist p
       cross join table(p.songs) ps
group by
       idplaylist
     , playlistname
     , playlistauthor
     , playlistduration
     , activeplaylist;

Также используйтеvarchar2 для строк, а неchar который просто применяет пустые отступы, которые вам не нужны (на самом деле, это никому не нужно - char предназначен только для переносимости и полноты ANSI и не предназначен для использования в новых разработках. varchar2 массив вам не понадобится rtrim(),

Другие вопросы по тегам