0

pl/sql 中是否有共同的祖先类?

例如,在 Java 中,“Object”类是所有类的共同祖先:

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 是否对所有类都有一个共同的祖先(根)类,因为我在文档中没有找到任何东西。回复已经确认没有这样一个共同的班级。无论如何,我将根据响应中的建议给出一些关于如何模拟公共根类的示例。

一种方法是 Alex 给出的技巧,通过使用 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;
4

1 回答 1

3

在 Java 意义上,我不这么认为。您可以通过以下方式获得一些稍微相似的东西ANYDATA

declare
  o anydata;
begin
  o := anydata.convertobject(myclass('hi ancestor'));
end;
/

您可以在此处阅读更多内容,当然也可以在文档中阅读,但这并没有太多示例。Tom Kytes 也谈到了它

但是鉴于您之前的问题,您最好将 Java 类存储在数据库中以通过这些类执行面向对象的工作,或者将其完全移出数据库......

于 2014-09-08T12:06:44.520 回答