Используя ora2pgpro, можно напрямую экспортировать пакеты Oracle как пакеты Postgres Pro, если задать для типа экспорта TYPE значение PACKAGE. ora2pgpro находит пакет и восстанавливает абстрактное синтаксическое дерево (abstract syntax tree, AST), представляющее исходный код в каталоге sources в текущем выходном каталоге. Затем утилита генерирует аналогичный код на PL/pgSQL в каталоге result в текущем выходном каталоге. ora2pgpro стремится преобразовать код исходного пакета так, чтобы он был максимально работоспособен, а если разработчику необходимо обратить внимание на определённые места, оставляет в коде получившегося пакета сообщения WARNING.
Ниже приведён пример пакета из Oracle.
CREATE OR REPLACE PACKAGE pkgc IS
TYPE r_customer_type IS RECORD(
customer_name varchar2(50),
credit_limit number(10,2)
);
TYPE t_customer_type IS VARRAY(2)
OF r_customer_type;
PROCEDURE VARRAY_TEST AS
t_customers t_customer_type := t_customer_type();
rec r_customer_type;
tmp_string varchar2(2000);
BEGIN
t_customers.EXTEND;
t_customers(t_customers.LAST).customer_name := 'ABC Corp';
t_customers(t_customers.LAST).credit_limit := 10000;
FOR indx in 1 .. t_customers.COUNT LOOP
rec := t_customers(indx);
tmp_string := 'RECORD: ' || rec.customer_name || ', ' || rec.credit_limit;
insert into log_table (id, line) values (1+ indx, tmp_string);
END LOOP;
END;
BEGIN delete from log_table;
END pkgc;Пакет Postgres Pro после преобразования выглядит так:
CREATE SCHEMA PKGC ;
CREATE OR REPLACE FUNCTION PKGC.__INIT__() RETURNS VOID AS $$
#package
BEGIN
delete from pkgc_log;
END;
$$ LANGUAGE plpgsql;
CREATE TYPE PKGC.r_customer_type AS (
customer_name varchar(50),
credit_limit numeric(10,2)
);
CREATE DOMAIN PKGC.t_customer_type PKGC.r_customer_type[];
CREATE OR REPLACE PROCEDURE PKGC.VARRAY_TEST () AS $$
#package
DECLARE
/*WARNING: collection constructors are not supported.*/
t_customers PKGC.t_customer_type /*:=*/ /*t_customer_type() /*varray_constructor_call*/*/;
rec PKGC.r_customer_type;
tmp_string varchar(2000);
BEGIN
t_customers = array_cat(t_customers, array_fill(NULL::PKGC.R_CUSTOMER_TYPE, ARRAY[1]));
t_customers[array_upper(T_CUSTOMERS, 1)].customer_name = 'ABC Corp';
t_customers[array_upper(T_CUSTOMERS, 1)].credit_limit = 10000;
FOR indx in 1 .. array_length(T_CUSTOMERS, 1) LOOP
rec = t_customers[indx];
tmp_string = 'RECORD: ' || rec.customer_name || ', ' || rec.credit_limit;
insert into pkgc_log (id, line) values (1+ indx, tmp_string);
END LOOP;
END; $$ LANGUAGE PLPGSQL;