postgresql 将Oracle迁移到Postgres

hpcdzsge  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(192)

我需要将所有对象从oracle迁移到postgres,但是当我尝试imoprt时,包显示了另一件事。
这是Oracle的原始包:

CREATE OR REPLACE PACKAGE DIV.div_pkg_bitacora AS

PROCEDURE registrar_bitacora( pv_origen       IN VARCHAR2,
                              pv_id_entidad   IN VARCHAR2,
                              pv_tipo_entidad IN VARCHAR2,
                              pv_par_entrada  IN VARCHAR2,
                              pv_par_salida   IN VARCHAR2,
                              pv_usuario      IN VARCHAR2,
                              pd_fecha_inicio IN TIMESTAMP,
                              pd_fecha_fin    IN TIMESTAMP);
END div_pkg_bitacora;
/

CREATE OR REPLACE PACKAGE body DIV.div_pkg_bitacora AS

PROCEDURE registrar_bitacora( pv_origen       IN VARCHAR2,
                              pv_id_entidad   IN VARCHAR2,
                              pv_tipo_entidad IN VARCHAR2,
                              pv_par_entrada  IN VARCHAR2,
                              pv_par_salida   IN VARCHAR2,
                              pv_usuario      IN VARCHAR2,
                              pd_fecha_inicio IN TIMESTAMP,
                              pd_fecha_fin    IN TIMESTAMP) IS
                              
   PRAGMA AUTONOMOUS_TRANSACTION;
   vv_flag   VARCHAR2(10);
BEGIN
   BEGIN
      SELECT es_log
        INTO vv_flag
        FROM div_log_procesos
       WHERE upper(origen) = upper(pv_origen);
   EXCEPTION 
      WHEN OTHERS THEN
         vv_flag := 'N';
   END;
   --
   IF vv_flag = 'S' THEN
      INSERT INTO div_log_dividendos(
             origen,
             id_entidad,
             tipo_entidad,
             parametros_entrada,
             parametros_salida,
             fecha,
             fecha_inicio,
             fecha_fin,
             usuario)
      VALUES(pv_origen,
             pv_id_entidad,
             pv_tipo_entidad,
             pv_par_entrada,
             pv_par_salida,
             SYSDATE,
             pd_fecha_inicio,
             pd_fecha_fin,
             pv_usuario);
      COMMIT;
   END IF;
EXCEPTION 
   WHEN OTHERS THEN
      NULL;
END;

END div_pkg_bitacora;
/

字符串
=这是在使用ora2pg的过程中生成的脚本=

SET client_encoding TO 'UTF8';

SET search_path = div,public;
\set ON_ERROR_STOP ON


-- Oracle package 'DIV_PKG_BITACORA' declaration, please edit to match PostgreSQL syntax.

--DROP SCHEMA IF EXISTS div_pkg_bitacora CASCADE;
CREATE SCHEMA IF NOT EXISTS div_pkg_bitacora;


--
-- dblink wrapper to call function div_pkg_bitacora.registrar_bitacora() as an autonomous transaction
--
CREATE EXTENSION IF NOT EXISTS dblink;

CREATE OR REPLACE PROCEDURE div_pkg_bitacora.registrar_bitacora ( pv_origen text, pv_id_entidad text, pv_tipo_entidad text, pv_par_entrada text, pv_par_salida text, pv_usuario text, pd_fecha_inicio TIMESTAMP, pd_fecha_fin TIMESTAMP) AS $body$
DECLARE
        -- Change this to reflect the dblink connection string
        v_conn_str  text := format('port=%s dbname=%s user=%s', current_setting('port'), current_database(), current_user);
        v_query     text;

BEGIN
        v_query := 'CALL div_pkg_bitacora.registrar_bitacora_atx ( ' || quote_nullable(pv_origen) || ',' || quote_nullable(pv_id_entidad) || ',' || quote_nullable(pv_tipo_entidad) || ',' || quote_nullable(pv_par_entrada) || ',' || quote_nullable(pv_par_salida) || ',' || quote_nullable(pv_usuario) || ',' || quote_nullable(pd_fecha_inicio) || ',' || quote_nullable(pd_fecha_fin) || ' )';
        PERFORM * FROM dblink(v_conn_str, v_query) AS p (ret boolean);

END;
$body$ LANGUAGE plpgsql SECURITY DEFINER;



CREATE OR REPLACE PROCEDURE div_pkg_bitacora.registrar_bitacora_atx ( pv_origen text, pv_id_entidad text, pv_tipo_entidad text, pv_par_entrada text, pv_par_salida text, pv_usuario text, pd_fecha_inicio TIMESTAMP, pd_fecha_fin TIMESTAMP) AS $body$
DECLARE
vv_flag   varchar(10);

BEGIN
   BEGIN
      SELECT es_log
        INTO STRICT vv_flag
        FROM div_log_procesos
       WHERE upper(origen) = upper(pv_origen);
   EXCEPTION
      WHEN OTHERS THEN
         vv_flag := 'N';
   END;
   --
   IF vv_flag = 'S' THEN
      INSERT INTO div_log_dividendos(
             origen,
             id_entidad,
             tipo_entidad,
             parametros_entrada,
             parametros_salida,
             fecha,
             fecha_inicio,
             fecha_fin,
             usuario)
      VALUES (pv_origen,
             pv_id_entidad,
             pv_tipo_entidad,
             pv_par_entrada,
             pv_par_salida,
             clock_timestamp(),
             pd_fecha_inicio,
             pd_fecha_fin,
             pv_usuario);

   END IF;
EXCEPTION
   WHEN OTHERS THEN
      NULL;
END;

$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
;
-- REVOKE ALL ON PROCEDURE div_pkg_bitacora.registrar_bitacora ( pv_origen text, pv_id_entidad text, pv_tipo_entidad text, pv_par_entrada text, pv_par_salida text, pv_usuario text, pd_fecha_inicio TIMESTAMP, pd_fecha_fin TIMESTAMP) FROM PUBLIC; -- REVOKE ALL ON PROCEDURE div_pkg_bitacora.registrar_bitacora_atx ( pv_origen text, pv_id_entidad text, pv_tipo_entidad text, pv_par_entrada text, pv_par_salida text, pv_usuario text, pd_fecha_inicio TIMESTAMP, pd_fecha_fin TIMESTAMP) FROM PUBLIC;
-- End of Oracle package 'DIV_PKG_BITACORA' declaration


在这种情况下该怎么办?

twh00eeo

twh00eeo1#

PostgreSQL没有包,但是你可以使用模式来组织functionsprocedures。查看下面的例子,它将Oracle package转换为PostgreSQL过程,调整了事务控制,异常处理和日期函数的语法以适应PostgreSQL的PL/pgSQL语言。

CREATE SCHEMA IF NOT EXISTS div;
     
CREATE OR REPLACE PROCEDURE div.registrar_bitacora(
    pv_origen VARCHAR,
    pv_id_entidad VARCHAR,
    pv_tipo_entidad VARCHAR,
    pv_par_entrada VARCHAR,
    pv_par_salida VARCHAR,
    pv_usuario VARCHAR,
    pd_fecha_inicio TIMESTAMP,
    pd_fecha_fin TIMESTAMP
)
LANGUAGE plpgsql
AS $$
DECLARE
    vv_flag VARCHAR(10);
BEGIN
    -- Assuming div_log_procesos table exists with correct columns
    BEGIN
        SELECT es_log INTO vv_flag
        FROM div_log_procesos
        WHERE upper(origen) = upper(pv_origen);
    EXCEPTION 
        WHEN OTHERS THEN
            vv_flag := 'N';
    END;

    IF vv_flag = 'S' THEN
        INSERT INTO div_log_dividendos (
            origen,
            id_entidad,
            tipo_entidad,
            parametros_entrada,
            parametros_salida,
            fecha,
            fecha_inicio,
            fecha_fin,
            usuario
        ) VALUES (
            pv_origen,
            pv_id_entidad,
            pv_tipo_entidad,
            pv_par_entrada,
            pv_par_salida,
            CURRENT_TIMESTAMP, -- Replaced SYSDATE with CURRENT_TIMESTAMP
            pd_fecha_inicio,
            pd_fecha_fin,
            pv_usuario
        );
    END IF;
    -- Removed COMMIT; PostgreSQL handles transactions outside of stored procedures
EXCEPTION 
    WHEN OTHERS THEN
        -- PostgreSQL does not support a NULL statement in EXCEPTION block
        RAISE NOTICE 'An error occurred.';
END;
$$;

字符串

相关问题