Oracle 在包中使用用户定义的聚合函数

Oracle 在包中使用用户定义的聚合函数,oracle,package,aggregate-functions,Oracle,Package,Aggregate Functions,我的oracle版本是10.2。 我有一个用户定义的聚合函数,它使用如下对象: create type strcat_type as object ( cat_string varchar2(4000), static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number, member function ODCIAggregateIterate(self In Out strcat_type,v

我的oracle版本是10.2。 我有一个用户定义的聚合函数,它使用如下对象:

create type strcat_type as object ( 
cat_string varchar2(4000), 
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number, 
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return           
number, 
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)       
return number, 
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out   
varchar2,flags in number) return number 
)
create type body strcat_type is 
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number 
is 
begin 
  cs_ctx := strcat_type( null ); 
  return ODCIConst.Success; 
end; 

member function ODCIAggregateIterate(self IN OUT strcat_type, 
                                   value IN varchar2 ) 
return number 
is 
begin 
   self.cat_string := self.cat_string || ','|| value; 
   return ODCIConst.Success; 
end; 

member function ODCIAggregateTerminate(self IN Out strcat_type, 
                                     returnValue OUT varchar2, 
                                     flags IN number) 
return number 
is 
begin 
  returnValue := ltrim(rtrim(self.cat_string,','),','); 
  return ODCIConst.Success; 
end; 

member function ODCIAggregateMerge(self IN OUT strcat_type, 
                                 ctx2 IN Out strcat_type) 
return number 
is 
begin 
  self.cat_string := self.cat_string || ',' || ctx2.cat_string; 
  return ODCIConst.Success; 
end;
end;
CREATE or replace 
FUNCTION strcat(input varchar2 ) 
RETURN varchar2 
PARALLEL_ENABLE AGGREGATE USING strcat_type; 
但是当我试着把这个东西放进一个包里

create or replace package common is
type strcat_type as object ( 
cat_string varchar2(4000), 
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number, 
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return           
number, 
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)       
return number, 
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out   
varchar2,flags in number) return number 
)
end common;
它导致pls-00540、pls-00707,我如何使用此对象创建包?如何将我的类型主体以及所有这些静态和成员函数放在包主体中

我的体型是这样的:

create type strcat_type as object ( 
cat_string varchar2(4000), 
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number, 
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return           
number, 
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)       
return number, 
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out   
varchar2,flags in number) return number 
)
create type body strcat_type is 
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number 
is 
begin 
  cs_ctx := strcat_type( null ); 
  return ODCIConst.Success; 
end; 

member function ODCIAggregateIterate(self IN OUT strcat_type, 
                                   value IN varchar2 ) 
return number 
is 
begin 
   self.cat_string := self.cat_string || ','|| value; 
   return ODCIConst.Success; 
end; 

member function ODCIAggregateTerminate(self IN Out strcat_type, 
                                     returnValue OUT varchar2, 
                                     flags IN number) 
return number 
is 
begin 
  returnValue := ltrim(rtrim(self.cat_string,','),','); 
  return ODCIConst.Success; 
end; 

member function ODCIAggregateMerge(self IN OUT strcat_type, 
                                 ctx2 IN Out strcat_type) 
return number 
is 
begin 
  self.cat_string := self.cat_string || ',' || ctx2.cat_string; 
  return ODCIConst.Success; 
end;
end;
CREATE or replace 
FUNCTION strcat(input varchar2 ) 
RETURN varchar2 
PARALLEL_ENABLE AGGREGATE USING strcat_type; 
我的功能是这样的:

create type strcat_type as object ( 
cat_string varchar2(4000), 
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number, 
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return           
number, 
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)       
return number, 
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out   
varchar2,flags in number) return number 
)
create type body strcat_type is 
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number 
is 
begin 
  cs_ctx := strcat_type( null ); 
  return ODCIConst.Success; 
end; 

member function ODCIAggregateIterate(self IN OUT strcat_type, 
                                   value IN varchar2 ) 
return number 
is 
begin 
   self.cat_string := self.cat_string || ','|| value; 
   return ODCIConst.Success; 
end; 

member function ODCIAggregateTerminate(self IN Out strcat_type, 
                                     returnValue OUT varchar2, 
                                     flags IN number) 
return number 
is 
begin 
  returnValue := ltrim(rtrim(self.cat_string,','),','); 
  return ODCIConst.Success; 
end; 

member function ODCIAggregateMerge(self IN OUT strcat_type, 
                                 ctx2 IN Out strcat_type) 
return number 
is 
begin 
  self.cat_string := self.cat_string || ',' || ctx2.cat_string; 
  return ODCIConst.Success; 
end;
end;
CREATE or replace 
FUNCTION strcat(input varchar2 ) 
RETURN varchar2 
PARALLEL_ENABLE AGGREGATE USING strcat_type; 

如何将所有这些内容打包到一个包中,当我需要聚合时,我只需输入“common.strcat(colName)”。

对象类型是SQL对象(如表、索引…),它们不能在包中定义(就像您不会在包中定义索引或视图一样)

见相关问题: