PL / SQL реализация наследования, где процедура реализована под подобъектом - PullRequest
1 голос
/ 08 мая 2020

Диаграмма отношений сущностей

enter image description here

Проблема:

Учитывая иерархию наследования, изображенную в объектной модели транспортных средств find решение следующих вопросов
1. Определите соответствующие типы объектов и реализуйте иерархию типов наследования транспортных средств
2. Функция-член get_vehicle возвращает полную информацию о соответствующем типе транспортных средств
3. Процедура-член set_gear_count занимает два параметрирует gear_count и идентификатор транспортного средства и обновляет gear_count велосипеда.
4. Создайте анонимный блок PL SQL, создайте экземпляры грузовиков и велосипедов и вставьте их в соответствующую таблицу. Затем продемонстрируйте использование методов-членов get_vechile и set_gear_count.

Для этой проблемы я написал следующий PL / SQL, но получаю следующую ошибку:

SQL> @inheritance;

Warning: Type Body created with compilation errors. 

Ошибка возникает, когда я пытаюсь запустить тело CREATE TYPE BODY bicycle AS, а указанная c область ошибки - set_gear_count процедура.

SQL> show error
Errors for TYPE BODY BICYCLE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
10/1     PL/SQL: SQL Statement ignored
10/13    PL/SQL: ORA-00947: not enough values
SQL>

Написанный мной код выглядит следующим образом:

--creating the base vehicle object type
CREATE OR REPLACE TYPE vehicle_t AS OBJECT
(
vehicle_id NUMBER,
manufacturer VARCHAR2(30),
purchase_date DATE,
color VARCHAR2 (10),
MEMBER FUNCTION get_vehicle RETURN VARCHAR2
)NOT FINAL;
/

CREATE TYPE BODY vehicle_t AS
MEMBER FUNCTION get_vehicle RETURN VARCHAR2
IS 
BEGIN
RETURN 'Vehicle ID:'|| TO_CHAR (vehicle_id) || 'Manufacturer:'|| manufacturer || 'Purchase Date:'||purchase_date||'Color:'||color;
END get_vehicle;
END;
/

-- CREATING SUB TYPE OF VEHICLE_T POWERED_VEHICLE  
CREATE OR REPLACE TYPE powred_vehicle UNDER vehicle_t
(
fule_type VARCHAR2(30),
license_number VARCHAR2 (10),
model VARCHAR2 (10),
OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2
)FINAL;
/

CREATE TYPE BODY powred_vehicle AS
OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2
IS 
BEGIN
RETURN (self AS vehicle_t).get_vehicle || 'Fuel Type:'|| fule_type || 'License Number:'||license_number||'Model:'||model;
END get_vehicle;
END;
/

CREATE OR REPLACE TYPE bicycle UNDER vehicle_t
(
gear_count number,
OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2,
MEMBER PROCEDURE set_gear_count (p_gear_count IN bicycle, p_vehicleid IN vehicle_t)
)FINAL;
/


CREATE TABLE vehicle_tab OF bicycle;

Здесь возникает ошибка.

CREATE TYPE BODY bicycle AS
OVERRIDING MEMBER FUNCTION get_vehicle RETURN VARCHAR2
IS 
BEGIN
RETURN (self AS vehicle_t).get_vehicle || 'Gear Count:'|| TO_CHAR(gear_count);
END get_vehicle;
MEMBER PROCEDURE set_gear_count (p_gear_count IN bicycle, p_vehicleid IN vehicle_t)
IS
BEGIN
INSERT INTO vehicle_tab VALUES (p_gear_count, p_vehicleid);
END set_gear_count;
END;
/

1 Ответ

2 голосов
/ 08 мая 2020

Кажется, vehicle_tab - это велосипедный стол. Я думаю, вы хотите это сделать?

INSERT INTO vehicle_tab VALUES (SELF);

Кроме того, я думаю, что сбивает с толку тот факт, что p_gear_count относится к типу bike: не должно ли это быть какое-то число?

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