【问题标题】:Oracle plsql object member functionoracle plsql对象成员函数
【发布时间】:2014-02-27 20:00:09
【问题描述】:

假设一个对象被创建为:

CREATE OR REPLACE type test_obj as object ( 
  item varchar2(20),
  constructor function test_obj return self as result
)

CREATE OR REPLACE type body test_obj as
  constructor function test_obj return self as result as
  begin
    self.item := 'xyz';
    return;
  end;
end;

那么在plsql中可以这样使用:

declare
  x test_obj; 
begin
  x:= test_obj();
end;

并且可以创建成员函数并调用它们,例如:

x test_obj := test_obj();
y number;    
y := x.somefunction('abc');

是否可以创建一个成员函数来支持这种类型的语法:

x test_obj := test_obj();
y number;    
y := x('abc');

【问题讨论】:

  • 换句话说,是否存在“默认”成员函数之类的东西?据我所知,不是。
  • 因为调用构造函数需要对象名,x test_obj := test_obj();oracle 开门见山。也许有一天!!!
  • 在该范围内,x 是局部变量的名称(test_obj 类型)。它不能像函数一样被调用。但是,您可以为test_obj 创建一个替代构造函数,以便您可以y := test_obj('abc');
  • 另一方面,如果您声明x 是一个由VARCHAR2 索引的数组(例如table of test_obj),那么您可以执行x('abc') := test_obj();y := x('abc');(如果y 是声明为另一个test_obj)
  • 据我所知,您希望在 C++ 中拥有类似函子的东西,对吧? int operator()(char* p) { /* 那里的代码 */ }. PL/SQL 不允许重载 +、-、/、() 等运算符。从这个意义上说,似乎没有办法获得类似于 C++ 的函子。

标签: oracle object plsql


【解决方案1】:

我认为这是不可能的。这样做会破坏面向对象方法的目的。 由于 x 是对象类型的实例,因此您必须使用点表示法调用其方法。

BR, 电视

【讨论】:

  • 我将此标记为正确答案,因为在 plsql 中无法做到这一点。我不同意拥有“默认成员函数”会破坏面向对象方法的目的。
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多