PL / SQL: оператор игнорируется, а PLS-00382: выражение имеет неправильный тип в возвращаемом - PullRequest
1 голос
/ 05 октября 2019

У меня есть пробелм в моем тесте PL SQL с Oracle 11g. Моя задача - скидка 20%, если аудио-CD выпущены более года назад. Я сделал это заявление

CREATE OR REPLACE TYPE BODY disk_type AS
OVERRIDING MEMBER FUNCTION discountPrice RETURN NUMBER IS
    BEGIN
      IF 
         albumReleaseDate > to_char(trunc(SYSDATE - interval '1' year,'YEAR'),'YYYYMM') 
         AND  mediaType = 'Audio CD'
         THEN RETURN albumPrice = (albumPrice * 0.8);
      END IF;
    END discountPrice;
END;

Однако я получил это сообщение об ошибке

7/15      PL/SQL: Statement ignored
7/33      PLS-00382: expression is of wrong 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 instantiable not final
/
create table albums of album_type 
object id system generated
 /

Это мой подтип

    create or replace type disk_type under album_type 
( mediaType         varchar(10), -- Audio CD wull be 'Audio CD'
 diskNum            number(2), -- number of disks
 diskUsedPrice      number(9,2),
 diskDeliveryCost   number(9,2), 
overriding member function discountPrice return number)
/

1 Ответ

0 голосов
/ 05 октября 2019

Вам необходимо вернуть переменную с помощью предложения RETURN. присвоение значения переменной должно быть отдельной логикой.

CREATE OR REPLACE TYPE BODY disk_type AS
OVERRIDING MEMBER FUNCTION discountPrice RETURN NUMBER IS
    BEGIN
      IF 
         albumReleaseDate > to_char(trunc(SYSDATE - interval '1' year,'YEAR'),'YYYYMM') 
         AND  mediaType = 'Audio CD'
         THEN return (albumPrice * 0.8); -- direct return, no assignment
      END IF;
      Return albumPrice; -- added this
    END discountPrice;
END;

Этого можно добиться также с помощью простого оператора case:

CREATE OR REPLACE TYPE BODY disk_type AS
OVERRIDING MEMBER FUNCTION discountPrice RETURN NUMBER IS
    BEGIN
       Return albumPrice * ( case 
              when albumReleaseDate > to_char(trunc(SYSDATE - interval '1' year,'YEAR'),'YYYYMM') 
                   AND  mediaType = 'Audio CD'
         THEN 0.8
         ELSE 1 END)
    END discountPrice;
END;

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...