ВЫБЕРИТЕ Значения из 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()
,