3

请帮助我理解这个错误。可能是我必须做 ud_mosh_dvig(x number, y number) 并在之后创建类型体。

create or replace type CAR as object
(
 mosh_dvig number,
 obiem_dvig number,
 color varchar2(20),
 type_form varchar2(20),
 massa number,
 num_peredach number,
 ud_mosh number,
 member function ud_mosh_dvig return number
);

create or replace type body CAR
is
member function ud_mosh_dvig return number
as
begin 
 self.ud_mosh:=self.mosh_dvig/self.massa;
 return self.ud_mosh;
end ud_mosh_dvig;
end;
4

1 回答 1

4

默认情况下,对于每个非静态函数,隐式声明self的参数都处于IN参数模式。这意味着,它根本无法修改。但是,需要注意的是,对于非静态程序,self参数是IN OUT默认参数模式。

虽然允许函数返回多个值、更改ud_mosh对象的 value 属性并将相同的值返回给调用者并不是一个好习惯,但在这种情况下,您可以self在参数模式下显式声明函数的IN OUT参数:

create or replace type CAR as object (
  mosh_dvig    number,
  obiem_dvig   number,
  color        varchar2(20),
  type_form    varchar2(20),
  massa        number,
  num_peredach number,
  ud_mosh      number,
  member function ud_mosh_dvig(self in out car) return number
);

TYPE CAR compiled

create or replace type body CAR
is
  member function ud_mosh_dvig(self in out car) 
  return number as
  begin 
    self.ud_mosh := self.mosh_dvig/self.massa;
    return self.ud_mosh;
  end ud_mosh_dvig;
end;

TYPE BODY CAR compiled

但是您将无法在 SQL 中使用该函数,因为在IN OUT参数模式下声明了函数的形式参数 - 仅限 PL/SQL

set serveroutput on;
clear screen;
declare
  l_obj  car;
  l_obj1 car;
  l_res number;
begin
  l_obj := new car(1,1,'1','1',4,1,1);
  l_res := l_obj.ud_mosh_dvig();
  dbms_output.put_line('ud_mosh prop value: ' || l_obj.ud_mosh || chr(13) 
                       || 'Function returns: ' || to_char(l_res));
end; 
/

anonymous block completed

ud_mosh prop value: 0.25
Function returns:   0.25
于 2013-10-28T19:56:11.607 回答