我对 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/