首页 > 解决方案 > 如何在 sql oracle 中插入子类型值?

问题描述

我对对象关系数据库和 Oracle 非常陌生,并且正在尝试将子类型值插入表中。我不确定创建表或插入表时是否是语法错误,因此任何帮助都会很棒。

这是一个音乐数据库,已被指示表中必须有 2 个子类型;ALBUM 带有一个 varray 和一个嵌套表(因此任何替代设计在这里都无济于事)。

create or replace type artist_type as object 
(artistName     varchar(50), 
 artistRole     varchar(25))
/ 
create type artist_array_type  
as varray(5) of artist_type
/ 
create or replace type review_type as object 
(reviewerName   varchar(25), 
 reviewDate     date,
 reviewText     varchar(250), 
 reviewScore    number)
/
create or replace type review_table_type as table of review_type
/
create or replace type album_type as object 
(albumTitle         varchar(50),
albumPlaytime       number(3), -- minutes
albumReleaseDate    date, 
albumGenre      varchar(15),
albumPrice      number(9,2),
albumTracks     number(2),
albumArtists        artist_array_type,
albumReviews        review_table_type,
member function discountPrice return number,
member function containsText (pString1 varchar2, pString2 varchar2) return integer)
not final 
/
create or replace type disk_type under album_type 
( mediaType         varchar(10),
diskNum         number(2), -- number of disks
diskUsedPrice       number(9,2),
diskDeliveryCost    number(9,2), 
overriding member function discountPrice return number)
/
create or replace type mp3_type under album_type
(downloadSize   number, -- size in MB
overriding member function discountPrice return number)
/
-- create tables --
create table albums of album_type 
object id system generated
nested table albumReviews store as store_reviews 
/ 

我尝试了以下方法:

insert into albums (albumTitle , albumPlaytime, albumReleaseDate, albumGenre, albumPrice, albumTracks, albumArtists) 
values (mp3_type('The Essential Bob Dylan', 99, '8-Jul-2016', 'Pop', 37.00, 32, artist_array_type(artist_type('Bob Dylan', 'Composer'), artist_type('Bob Dylan', 'Vocals')), 165));

并删除列:

insert into albums  
values (mp3_type('The Essential Bob Dylan', 99, '8-Jul-2016', 'Pop', 37.00, 32, artist_array_type(artist_type('Bob Dylan', 'Composer'), artist_type('Bob Dylan', 'Vocals')), 165));

此外,添加嵌套表值 albumReviews 也不起作用:

    insert into albums  
    values (mp3_type('The Essential Bob Dylan', 
                     99, 
                     '8-Jul-2016', 
                     'Pop', 
                     37.00, 
                     32, 
                     artist_array_type(artist_type('Bob Dylan', 'Composer'), artist_type('Bob Dylan', 'Vocals')), 
                     review_table_type('Shawn', '24-Jul-2018', 'Wife loved it!', 5),
                     165));

同样,我并没有完全了解 ORD,并且可能遗漏了一些东西,但感谢您提供任何帮助!

标签: sqldatabaseoraclesubtype

解决方案


你的第二个INSERT是缺少albumReviews价值观。只需NULL在最后一个数字之前添加 a 即可使此语句起作用:

insert into albums  
values (mp3_type('The Essential Bob Dylan', 99, '8-Jul-2016', 'Pop', 37.00, 32, artist_array_type(artist_type('Bob Dylan', 'Composer'), artist_type('Bob Dylan', 'Vocals')), null, 165));

这里有几个教训:

  1. 使您的示例尽可能简单。更多的人会帮助一个更简单的例子。在简化代码的过程中,您可能会自己发现问题。
  2. 没有人再使用对象关系技术了。插入简单数据就这么难,真是可笑。有时感觉几乎没有人再使用 Oracle。告诉你的教授,他们至少落后了两代人。除非这个任务是一个警示故事。

推荐阅读