Создание функций-членов в oracle plsql - PullRequest
0 голосов
/ 25 сентября 2019

Я новичок в oracle и plsql и обычно пишу на python.Мне нужно создать функции-члены под подтипами и не понимаю, на что ссылаются ошибки PLS-00538 и PLS-00539.Вот мой код:

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),
member function discountPrice return number)
 return integer)
not instantiable 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 or replace type body album_type as
member function discountPrice return number is
begin
    return albumprice;
end discountPrice;
end;
/

Однако при применении того же к подтипу это выдает ошибки: 1) PLS-00539: в объекте объявлена ​​подпрограмма «DISCOUNTPRICE»тело типа и должно быть определено в спецификации типа объекта.2) PLS-00538: подпрограмма или курсор «DISCOUNTPRICE» объявлены в спецификации типа объекта и должны быть определены в теле типа объекта

create or replace type body disk_type as
member function discountPrice return number is
discount number;
begin
    discount:= round(albumprice - albumprice*0.20,0);
return discount;
end discountPrice;
end;
/

В конечном счете, я хочу, чтобы функция предоставила скидку 20%.По логике это было бы:

if mediaType == 'Audio_CD':
    price = albumprice - albumprice*0.20

1 Ответ

1 голос
/ 25 сентября 2019

Объявление функции в теле типа должно точно соответствовать объявлению в спецификации типа.В этом случае ключевое слово OVERRIDING отсутствует.

create or replace type body disk_type as
overriding member function discountPrice return number is
discount number;
begin
    discount:= round(albumprice - albumprice*0.20,0);
return discount;
end discountPrice;
end;
/

Кроме того, код содержит ошибку около return integer), но я предполагаю, что это просто опечатка.

...