Миграция базы данных из PostgreSQL в Oracle

Я перевожу свой сервер базы данных из PostgreSQL в Oracle 11g. Я пробовал различные инструменты, такие как Squirrel SQL. Но большинство инструментов миграции поддерживают перенос таблиц и представлений. Я не могу найти решение для переноса моих процедур и функций. Как я могу перенести функции и процедуры. Пожалуйста, найдите одну из функций ниже.

CREATE OR REPLACE FUNCTION hrms.fngetstatus(iactdate character varying, ideactdate character varying)
  RETURNS character varying AS
$BODY$
   returnval   VARCHAR (1);
BEGIN
   IF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                      TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
      AND TO_DATE (ideactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
        returnval := 'D';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL
   THEN

       returnval := 'D';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
        returnval := 'A';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL
   THEN
      returnval := 'A';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
      returnval := 'D';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') =
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') =
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
      returnval := 'D';
        ELSIF     TO_DATE (ideactdate, 'mm/dd/yyyy') >=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (iactdate, 'mm/dd/yyyy') is null                      
   THEN
      returnval := 'A';  
        ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')   
   THEN
      returnval := 'A';  
        ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')   
   THEN
      returnval := 'D';   
          ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')   
   THEN
      returnval := 'D';    
   END IF;
   RETURN returnval;
END$BODY$
  LANGUAGE edbspl VOLATILE SECURITY DEFINER
  COST 100;
ALTER FUNCTION hrms.fngetstatus(character varying, character varying)
  OWNER TO enterprisedb;

1 ответ

Решение

Единственное, что вам нужно изменить - это код "вокруг" функции. Oracle использует другой "заголовок", чем Postgres.

Таким образом, функция в PL/SQL будет выглядеть следующим образом. Я только изменил начало CREATE OR REPLACE и часть после финала END,

CREATE OR REPLACE FUNCTION fngetstatus(iactdate varchar, ideactdate varchar)
  RETURN varchar 
AS
   returnval   VARCHAR (1);
BEGIN
   IF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                      TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
      AND TO_DATE (ideactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
        returnval := 'D';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL
   THEN

       returnval := 'D';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
        returnval := 'A';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL
   THEN
      returnval := 'A';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
      returnval := 'D';
   ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') =
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') =
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
   THEN
      returnval := 'D';
        ELSIF     TO_DATE (ideactdate, 'mm/dd/yyyy') >=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (iactdate, 'mm/dd/yyyy') is null                      
   THEN
      returnval := 'A';  
        ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')   
   THEN
      returnval := 'A';  
        ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')   
   THEN
      returnval := 'D';   
          ELSIF     TO_DATE (iactdate, 'mm/dd/yyyy') >
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')
         AND TO_DATE (ideactdate, 'mm/dd/yyyy') <=
                       TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy')   
   THEN
      returnval := 'D';    
   END IF;
   RETURN returnval;
END;
/

Вот пример SQLFiddle: http://sqlfiddle.com/

Другие вопросы по тегам