ora2pg icon indicating copy to clipboard operation
ora2pg copied to clipboard

User-Defined Aggregate Migrate

Open xinjirufen opened this issue 5 years ago • 1 comments

Hi Darold, Migrated Oracle user-defined aggregate function, but it doesn't work,the obtained file content is empty.

Oracle user-defined aggregate code as below: Oracle Types:

create or replace type list_agg as object
(
  total varchar2(4000),
  static function ODCIAggregateInitialize(sctx IN OUT list_agg)
    return number,
  member function ODCIAggregateIterate(self  IN OUT list_agg,
                                       value IN varchar2) return number,
  member function ODCIAggregateTerminate(self        IN list_agg,
                                         returnValue OUT varchar2,
                                         flags       IN number)
    return number,
  member function ODCIAggregateMerge(self IN OUT list_agg,
                                     ctx2 IN list_agg) return number
)

Types bodies:

create or replace type body list_agg is
  static function ODCIAggregateInitialize(sctx IN OUT list_agg) return number is
  begin
    sctx := list_agg(null);
    return ODCIConst.Success;
  end;
  member function ODCIAggregateIterate(self  IN OUT list_agg,
                                       value IN varchar2) return number is
  begin
    self.total := self.total || value;
    return ODCIConst.Success;
  end;
  member function ODCIAggregateTerminate(self        IN list_agg,
                                         returnValue OUT varchar2,
                                         flags       IN number) return number is
  begin
    returnValue := substr(self.total, 2);
    return ODCIConst.Success;
  end;
  member function ODCIAggregateMerge(self IN OUT list_agg,
                                     ctx2 IN list_agg) return number is
  begin
    self.total := self.total || ctx2.total;
    return ODCIConst.Success;
  end;
end;

Oracle Function:

CREATE OR REPLACE FUNCTION ColumnToRow(input varchar2 )
RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING list_agg;

ora2pg command:

ora2pg -d --no_header -o test.sql -t FUNCTION -a COLUMNTOROW  -n FFDEV -s "dbi:Oracle:host=127.0.0.1;sid=xyorcl;port=1521" -u test -w test

Best regards

xinjirufen avatar Oct 14 '20 07:10 xinjirufen

Thanks for the report, this is not supported yet. It require some major enhancement to the TYPE export and your code sample will be helpful, let's keep the issue open as a remainder.

darold avatar Oct 14 '20 07:10 darold