sql - PL/SQL 私有(private)对象方法

标签 sql oracle plsql oracle10g

我对 Oracle 的 PL/SQL(使用 10g)有点陌生,我想知道是否有一种方法可以在对象类型中创建一个私有(private)方法,就像其他语言(Java, C++、C# 等...)。我知道可以在包中创建私有(private)方法,但我似乎找不到针对对象类型执行此操作的方法。我不断收到编译器错误提示:

Error: PLS-00539: subprogram 'FOO' is declared in an object type body 
and must be defined in the object type specification.

最佳答案

好的,这是我非常简短地测试过的一个潜在解决方案,到目前为止它似乎有效:

创建一个将标记为 NOT FINAL 和 NOT INSTANTIABLE 的父对象类型,然后将所有私有(private)代码放入其中。私有(private)方法不会是真正私有(private)的,但将它们放在非最终且不可实例化的类型中会阻止它们被调用。在可实例化子类型中,通过 SELF 引用父类(super class)型中的“私有(private)”方法。 示例:


create or replace type PrivateFoo under SuperFoo
(

  member procedure setUpCommonFoo
) NOT INSTANTIABLE NOT FINAL;

create or replace type body PrivateFoo is
  -- Member procedures and functions
  member procedure setUpCommonFoo is
        begin
            SELF.someAttrib:='Some Common Default Value';
        end;
end;

create or replace type Foo under PrivateFoo
(
    CONSTRUCTOR FUNCTION Foo RETURN SELF AS RESULT,
    CONSTRUCTOR FUNCTION Foo(fkey FooKey) RETURN SELF AS RESULT -- assume fkey is defined in SuperFoo, and FooKey type is defined somewhere else ;)
)

create or replace type body Foo is
    --no-arg Constructor For basic Foo set up.
    CONSTRUCTOR FUNCTION PartyConvertor RETURN SELF AS RESULT AS
    BEGIN
        self.setUpCommonFoo;
        RETURN;
    END;
        --alt constructor for other situations...
    CONSTRUCTOR FUNCTION PartyConvertor(fkey FooKey) RETURN SELF AS RESULT AS
    BEGIN
        self.setUpCommonFoo;
                SELF.rarelyUsedAttrib:='Special Value!'; --just assume that someAttrib and rarelyUsedAttrib actually exist ;)
        self.fkey := fkey;
        RETURN;
    END;
        --Other Members go here...
end;

现在我不得不承认,我不是很喜欢这种模式。这看起来很尴尬和笨拙。我可能会尽可能地避免对象类型并坚持使用包(或非常简单的对象类型)。 package-as-fatory只是帮我解决了构造函数的私有(private)公共(public)代码问题,其他类型的公共(public)代码重构没有。

...除非有更好的方法来处理对象类型...有人吗?有人吗?

关于sql - PL/SQL 私有(private)对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1580205/

相关文章:

oracle - Entity Framework 创建疯狂的 bin 表?为什么?

excel - 想要通过 PL/SQL 将两个 Excel 工作表作为邮件附件

mysql - mysql中如何通过连接两个表来更新一个表?

Sql plus无法连接到oracle

sql - 如何根据列的累积和创建不相等的十分位数/四分位数

oracle - 在pl/sql block 中声明变量

oracle - 为什么将字符串变量传递到 PL/SQL where 子句时得到 'No data found'

SQL ServerWhere子句Case语句?

SQL 数字小数

SQL执行计划缓存