在对象类型中选择成员函数的Oracle错误

时间:2014-06-16 12:10:33

标签: oracle plsql user-defined-types

我在设置类型中的成员函数时遇到问题。我是PL / SQL的新手,并且一直试图解决这个问题,但没有成功。 我的目标是在singleDeck_type中有一个方法来计算不同体型模型的数量。

经过多次播放后,我发现唯一的问题似乎是我的select语句,但我收到的唯一错误是"警告:执行完成并发出警告"。

create or replace type bodyModel_Type as object(
modelID int,
modelName varchar2(45),
floorType varchar2(5),
manufacturer varchar2(45),
bLength number(8,2),
bWidth number(8,2),
noOfAxles int);
/
create table bodyModel_table of bodyModel_Type;
alter table bodyModel_table
Add (constraint bodyModel_PK primary key (modelID));

create or replace type engineModel_type as object(
engineModelID int,
engineDescription varchar2(45),

engineType varchar2(25),
engineCapacity int);
/
create table engineModel_table of engineModel_type;
alter table engineModel_table
Add (constraint engineModel_PK primary key (engineModelID));

create or replace type accessory_type as object(
accessoryID int,
accessoryName varchar2(45),
accessoryDescription varchar2(45),
installDate date);
/

create or replace type table_accessory_type as table of accessory_type;
/

create or replace type bus_type as object(
busID int,
registrationNo varchar2(10),
registrationExpireDate date,
bodyModel REF bodyModel_type,
engineModel Ref EngineModel_type)
not Final;
/
create table bus_table of bus_type;
alter table bus_table
Add (constraint bus_pk primary key (busID));



create or replace type singleDeck_type under bus_type(
noOfDoors int,
seatingCapacity int,
standingCapacity int);
/
create or replace type doubleDeck_type under bus_type(
lowerDeckSeatingCap int,
LowerDeckStandingCap int,
luggageCapacity number(8,2),
upperDeckCapacity int);
/
create table singleDeck_Table of singleDeck_Type;
alter table singleDeck_Table
Add (constraint SD_bus_pk primary key (busID));

create table doubleDeck_Table of doubleDeck_Type;
alter table doubleDeck_Table
Add (constraint DD_bus_pk primary key (busID));

ALTER TYPE singleDeck_type ADD MEMBER procedure count_bodytype
  RETURN NUMBER CASCADE;
  /
CREATE OR REPLACE TYPE BODY singleDeck_type
AS
  MEMBER FUNCTION count_bodytype
  RETURN NUMBER
IS
  N REAL;
BEGIN

SELECT COUNT(S.busID)
  INTO N
  FROM singleDeck_Table s
  WHERE DEREF(s.bodyRef)=self;
  RETURN N;
END count_bodytype;

END;
/

拜托,请帮助!!

1 个答案:

答案 0 :(得分:0)

正如OracleUser所说,您可以在脚本中的每个PL / SQL部分之后添加show errors以显示生成的任何错误;或者您可以在任何时候查询user_errors视图以查看针对所有PL / SQL对象的错误。

您正在添加成员过程,但在对象规范中指定了返回类型。如果它正在返回一些东西那么它必须是一个函数,并且你已经在体内正确地完成了它。

ALTER TYPE singleDeck_type ADD MEMBER function count_bodytype
  RETURN NUMBER CASCADE;
/

身体确实仍有错误:

ORA-00904: "S"."BODYREF": invalid identifier

您有一个bodyModel字段REF,所以我只能认为您想这样做:

  WHERE DEREF(s.bodyModel)=DEREF(self.bodyModel);

  WHERE DEREF(s.bodyModel).modelID=DEREF(self.bodyModel).modelID;

虽然您的查询似乎在计算与当前身体模型相同的身体模型的单层巴士的数量,这与您在问题中所说的不匹配,“计算不同身体模型类型的数量”。这听起来像你需要static method,而不是成员方法。