Хочу создать свой тип данных в oracle
Хочу создать свой "супертип", сижу на 12 версии оракла, но походе что то не понимаю
Тип - схема робота(чертёж) Объект - робот
У робота будут следующие свойства:
- модель процессора
- имя
- вес
Робот должен уметь:
- ходить(когда вызываем эту команду, в консоль должно вывестись "Робот (имя) пошёл")
- говорить(когда вызываем эту команду, робот должен вывести в консоль все свои характеристики)
После выполнения команд выходит ошибка "pls 905 sv_va_robot_t", что строка (sv_va_robot_t('Игорь', 'pentium g4560', '87 тонны') invalid или "pls 905 robot_h", что r robot_h := robot_h(null,null,null) invalid. Хотя я делаю все по учебнику С. Фейерштейн ст 919 и ст 921, подскажите, что я делаю не так
DROP TYPE robot_t FORCE;
DROP TYPE sv_va_robot_t FORCE;
CREATE TYPE robot_t AS OBJECT (
name VARCHAR2 (100) /*
, model_proc VARCHAR2 (100)
, ves VARCHAR2 (100)*/
, MEMBER FUNCTION to_string
RETURN VARCHAR2
) NOT FINAL;
/
CREATE OR REPLACE TYPE BODY robot_t
is
MEMBER FUNCTION to_string RETURN VARCHAR2
is
begin
RETURN 'Робот '|| self.name || ' идет';
end;
end;
/
CREATE TYPE sv_va_robot_t UNDER robot_t (
name VARCHAR2 (100)
, model_proc VARCHAR2 (100)
, ves VARCHAR2 (100)
, OVERRIDING MEMBER FUNCTION to_string RETURN VARCHAR2
);
/
CREATE OR REPLACE TYPE BODY sv_va_robot_t
IS
OVERRIDING MEMBER FUNCTION to_string RETURN VARCHAR2
IS
BEGIN
RETURN 'Робот говорит, что у него есть имя - '
|| self.name
|| ' модель процессора - '
|| self.model_proc
|| ' вес - '
|| self.ves
|| (SELF as robot_t).to_string;
END;
END;
/
declare
type shema_robota is table of robot_t;
shema shema_robota := shema_robota ( robot_t ('Жора')
, sv_va_robot_t('Игорь', 'pentium g4560', '87 тонны') );
begin
for x in 1..shema.count
loop
DBMS_OUTPUT.put_line (RPAD ('=', 60, '='));
DBMS_OUTPUT.put_line (shema (x).to_string);
END LOOP;
END;
/
create or replace type robot_h as object (
name varchar(100)
, mod_proc varchar(100)
, ves varchar(100)
, member function setname(name varchar(100)) return robot_h
, member function setmod_proc(mod_proc varchar(100)) return robot_h
, member function setves(ves varchar(100)) return robot_h);
/
declare
r robot_h := robot_h(null,null,null);
begin
c := c.setname('Игорь').setmod_proc('pentium g4560').setves('87 тонны');
end;
/
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Ошибка в том, что нельзя в унаследованом типе переопределить атрибут (пример из вопроса на db<>fiddle).
Сделайте так:
create or replace type baseRobotType force as object (
name varchar2 (16), member function say return varchar2
) not final not instantiable
/
create or replace type RobotType under baseRobotType (
proc varchar2 (16), weight number,
overriding member function say return varchar2
) final
/
create or replace type body RobotType is
overriding member function say return varchar2 is
begin
return 'Робот '||self.name||
' говорит, что у него '||self.proc||' и он весит '||self.weight;
end;
end;
/
exec dbms_output.put_line (RobotType ('Жора', 'ARM', 123.5).say);
Робот Жора говорит, что у него: ARM и он весит 123,5