Есть ли общий класс предков в pl/sql?PL/SQL: Любой общий класс предков?
Например, в Java класс "Объект" является общим предком для всех классов:
Object o;
o = new String("hi ancestor"); // a String is an Object
Но в PL/SQL, мы не можем сказать:
o Object; // Object class doesn't exist
o := new myclass('hi ancestor');
Обновление: вопрос был более теоретическим, чем практический, просто чтобы узнать, имеет ли класс pl/sql общий класс предков (root) для всех классов, так как я ничего не нашел в нем в документации. Ответы подтвердили, что не существует такого общего класса. Во всяком случае, я приведу несколько примеров того, как имитировать общий корневой класс, основываясь на суждениях ответов.
Способ сделать это трюк, данный Алексом, с использованием типа anydata, который имитирует кастинг для общего класса. Может быть полезно ввести любой класс в качестве параметра в функции. Пример использования:
create or replace type cla as object -- class
(
name varchar2(50)
);
declare
co cla; -- cla class object
co2 cla; -- another one
o anydata; -- Object class simulation object
ok pls_integer; -- to take value returned by the re-cast
begin
co := new cla('hi'); -- create cla object
o := anydata.convertobject(co); -- cast to anydata (not automatic)
ok := anydata.getobject(o, co2); -- re-cast to cla
dbms_output.put_line('co.name: ' || co.name);
dbms_output.put_line('co2.name: ' || co2.name);
end;
Другой способ, предложенный user272735, чтобы имитировать общий корень класс, создав класс, который будет родителем всех ваших корневых классов. Например:
create or replace type obj as object -- Object class simulation
(
oid varchar2(1000)
)
not final;
create or replace type cla1 under obj -- explicit inheritance
(
name varchar2(50)
);
create or replace type cla2 under obj -- explicit inheritance
(
money number(6)
);
declare
o1 cla1; -- cla1 class object
o1b cla1; -- another one
o2 cla2; -- cla2 class object
o2b cla2; -- another one
o obj; -- common ancestor
begin
o1 := new cla1('1', 'hi'); -- create cla1 object
o := o1; -- cast to obj (automatic)
o1b := treat(o as cla1); -- re-cast to cla1
dbms_output.put_line('o1.name: ' || o1.name);
dbms_output.put_line('o1b.name: ' || o1b.name);
o2 := new cla2('2', 222); -- create cla2 object
o := o2; -- cast to obj (automatic)
o2b := treat(o as cla2); -- re-cast to cla2
dbms_output.put_line('o2.money: ' || o2.money);
dbms_output.put_line('o2b.money: ' || o2b.money);
end;
номера PL/SQL объектная модель не имеет такого корневого класса иерархии классов, как Java 'java.lang.Object'. Вы должны построить его самостоятельно, если вам это нужно. – user272735
См. [Здесь] (http://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjbas.htm#ADOBJ002) для документов Oracle по объектно-реляционному кодированию. – tbone
@tbone спасибо, я уже знал эту страницу :-) – freesoft