所以我在我的新作品中已经开始使用类型了,而且它们几乎都是这样的
create or replace TYPE BODY T_Some_Type AS
CONSTRUCTOR FUNCTION T_Some_Type
RETURN SELF AS RESULT AS
BEGIN
INTIALIZE();
RETURN;
END T_Some_Type;
MEMBER PROCEDURE INTIALIZE AS
BEGIN
var1 := 0;
var2 := 0;
var3 := 0;
END INTIALIZE;
END;
熟练使用OOP但不熟悉pl / sql,我一直在想为什么要使用额外的过程来初始化变量,当它可以直接在构造函数中完成时,使对象界面更简单,更轻松。 这就是我通常会这样做的方式:
create or replace TYPE BODY T_Some_Type AS
CONSTRUCTOR FUNCTION T_Some_Type
RETURN SELF AS RESULT AS
BEGIN
var1 := 0;
var2 := 0;
var3 := 0;
RETURN;
END T_Some_Type;
END;
是否有任何优势或出于某种原因推荐这个? 请指教。
答案 0 :(得分:1)
请记住,自8.0版以来,Oracle中的对象功能发展缓慢,但在某些方面仍然非常有限。这是因为Oracle是一个具有结构化和程序化编程范式的关系数据库:面向对象不适合。
因此。在像Java这样的语言中,我们可以覆盖子类型中的方法,但是通过super()
调用在父实现中执行代码。
在11g之前,Oracle没有类似的扩展成员函数的机制。如果我们想要覆盖超类型的方法,我们必须复制子类型中的代码,这非常简单。有一个解决方法,它不是那么简单:将公共代码提取到超类型的单独方法中,并在超类型及其依赖项中调用该方法。
在11g Oracle中引入了“广义调用”。这允许我们在子类型上调用超类型代码。 Find out more。广义调用有一个主要限制,那就是我们不能将它与Constructor方法一起使用。因此,在其子类型的构造函数中,我们唯一的选择是将该代码放在问题中的initialize()
方法中。