SELECT 来自 Varray ORACLE 的值 SQL
SELECT Values from Varray ORACLE SQL
我正在使用 apex.oracle,我得到的错误是 [unsupported data type]
。
解释:我有一个名为 table 的播放列表,我想将一组歌曲存储到 Songs
字段中。为此,我定义了一个名为 PlaylistSongs
of varray
of 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']
。可以吗?
是 - 请参阅 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;
此外,use varchar2
for strings, not char
只是应用您不需要的空白填充(实际上,没有人需要它 - char 仅用于可移植性和 ANSI 完整性,并不意味着用于新开发。使用varchar2
数组你不需要 rtrim()
.
我正在使用 apex.oracle,我得到的错误是 [unsupported data type]
。
解释:我有一个名为 table 的播放列表,我想将一组歌曲存储到 Songs
字段中。为此,我定义了一个名为 PlaylistSongs
of varray
of 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']
。可以吗?
是 - 请参阅 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;
此外,use varchar2
for strings, not char
只是应用您不需要的空白填充(实际上,没有人需要它 - char 仅用于可移植性和 ANSI 完整性,并不意味着用于新开发。使用varchar2
数组你不需要 rtrim()
.