0

私のオラクルのバージョンは10.2です。次のようなオブジェクトを使用するuser_defined集計関数があります。

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 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 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)」を配置するだけですか?

4

1 に答える 1

1

OBJECTタイプはSQLオブジェクト(テーブル、インデックスなど)であり、パッケージで定義することはできません(パッケージ内でインデックスやビューを定義しない場合と同じです)。

関連するSOの質問を参照してください:PL /SQL内にOracleDatabaseオブジェクト・タイプを作成することは可能ですか?

于 2012-04-12T12:43:39.237 に答える