create or replace type Spoint as object(
x float,
y float,
member function distance(p in Spoint)
return float
);
create or replace type body Spoint as 
member function distance (p in Spoint)
return float
is 
result float;
 begin 
   result := ((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
   return result
   end distance;
   end;   create table testpoint of Spoint
   
   insert into testpoint values(4.0,5.0)
   insert into testpoint values(1.0,1.0)
   
   select * from testpoint
      declare 
   p1 Spoint;
   p2 Spoint;
   rest float;
   begin
     p1 := Spoint(4.0,5.0);
     p2 := Spoint(1.0,1.0);
     rest := p1.distance(p2);
     dbms_output.put_line(rest);
     end;declare段运行时报错,是什么问题?

解决方案 »

  1.   

    create or replace type body Spoint as 
       member function distance (p in Spoint) 
       return float 
       is 
          result float; 
       begin 
          result := ((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)); 
          return result;
       end distance; 
    end;return result;掉了;编译不会通过,声明时当然报错了
      

  2.   

    修改后还是报错,ORA-04068:已丢弃程序包的当前状态,
                              store procedure  "sys.spoint"有错误
    该怎么解决呢
      

  3.   

    我按照你的脚本运行下来,在return result后加上了分号,没问题。SQL> conn hr/oracle
    Connected.
    SQL> create or replace type spoint as object (
      2  x float,
      3  y float,
      4  member function distance(p in spoint)
      5  return float
      6  );
      7  /Type created.SQL> create or replace type body spoint as
      2  member function distance (p in spoint)
      3  return float
      4  is
      5  result float;
      6  begin
      7   result := ((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
      8  return result;
      9  end distance;
     10  end;
     11  /Type body created.SQL> create table testpoint of spoint;Table created.SQL> insert into testpoint values (4.0,5.0);1 row created.SQL> insert into testpoint values (1.0,1.0);1 row created.SQL> select * from testpoint;         X          Y
    ---------- ----------
             4          5
             1          1SQL> declare
      2  p1 spoint;
      3  p2 spoint;
      4  rest float;
      5  begin
      6   p1 := spoint(4.0,5.0);
      7   p2 := spoint(1.0,1.0);
      8   rest := p1.distance(p2);
      9   dbms_output.put_line(rest);
     10  end;
     11  /PL/SQL procedure successfully completed.SQL> set serveroutput on
    SQL> /
    25PL/SQL procedure successfully completed.
      

  4.   

    是不是运行是要把declare和body一起运行?这样就不会报错,但是没有输出结果
      

  5.   

    按照#3的来有结果的是否未
    set serveroutput on
      

  6.   

    我现在有这样一个想法:在DLL中定义一个distance(float,float,float,float)函数,用来计算两点距离,想在对象spoint的成员函数定义中通过调用该distance函数计算距离,该怎么实现?谢谢楼上两位仁兄的回答。
      

  7.   

    DLL?
    不确定是否可行,oracle调用java的方法是可以的
      

  8.   

    是可以的,我测试过一个加法函数,是这样实现的:
    create or replace library MYLIB
    as 'C:\oracle\ora90\LIB\dll.dll';CREATE OR REPLACE FUNCTION myadd (a binary_integer,b binary_integer) RETURN binary_integer AS
    LANGUAGE C NAME "mul"
    LIBRARY MYLIB
    PARAMETERS (a int,b int,
    RETURN int );
    select myadd(2,3) from dual但要在对象的一个成员函数中调用DLL中的方法就不知道该怎么做了?java中怎么实现的呢?
    冒昧的问下你的QQ号,以后好请教你问题,谢谢
      

  9.   

    http://download.oracle.com/docs/cd/B28359_01/java.111/b31225/chthree.htmqq用的少,还没csdn上的多,呵呵