Postgresql

使用 ora2pg 將 oracle 包遷移到 postgres 問題

  • September 2, 2019

我正在使用 ora2pg 將 oracle(12c) 包遷移到 postgres(Enterprise db 10.5)。對於大多數功能,遷移成功執行。但是,包中多次引用的一個函式會導致錯誤。我給出了以下程式碼的兩個版本:oracle

create or replace package body sms_package as
--- Other functions
PROCEDURE LOG_MESSAGE (LogType varchar2, LogDetails varchar2) IS
   BEGIN
       INSERT INTO SMS_TABLE (REF_DATE, LOG_TYPE, LOG_DETAILS)
       VALUES (SYSDATE, LogType, LogDetails);
       COMMIT;
   END;

ora2pg

CREATE OR REPLACE FUNCTION log_message (LogType text, LogDetails text) RETURNS VOID AS $body$
BEGIN
       INSERT INTO SMS_TABLE(REF_DATE, LOG_TYPE, LOG_DETAILS)
       VALUES (clock_timestamp(), LogType, LogDetails);
       COMMIT;
   END;
$body$
LANGUAGE PLPGSQL
;

參考範例:oracle

procedure sendtest (dash_type varchar2, sms_message varchar2) IS
       cursor x is
       SELECT ISDN FROM  oracle_store;
   begin
       dbms_output.put_line('1');
           if sms_message is not null then
               for i in x loop
                   insert into s_table(message_text, received_time, DELIVERY_STATUS, retry_attempts) values (..);
                   sms_package.LOG_MESSAGE (dash_type, 'sending to '||i.ISDN||' message =>'||sms_message);
                   dbms_output.put_line('notification_type='||dash_type||' sms='||sms_message);
               end loop;
               commit;
           end if;
   end;

ora2pg

CREATE OR REPLACE FUNCTION sendtest (dash_type text, sms_message text) RETURNS VOID AS $body$
DECLARE
       x CURSOR FOR
       SELECT ISDN FROM  postgres_store;
BEGIN
       RAISE NOTICE '1';
           if sms_message is not null then
               for i in x loop
                   insert into s_table(message_text, received_time, DELIVERY_STATUS, retry_attempts) values ();
                   sms_package.LOG_MESSAGE(dash_type, 'sending to '||i.ISDN||' message =>'||sms_message);
                   RAISE NOTICE 'notification_type=% sms=%', dash_type, sms_message;
               end loop;
               commit;
           end if;
   end;
$body$
LANGUAGE PLPGSQL

在收到此錯誤時,從另一個函式中呼叫該函式似乎存在問題

[42601] ERROR: syntax error at or near "sms_package"

如何從 postgres 的函式中執行另一個函式。如何從另一個函式中呼叫該函式

因為sms_package.LOG_MESSAGE是 PostgreSQL 中的一個函式,所以你必須PERFORM在 PL/pgSQL 中呼叫它:

PERFORM sms_package.LOG_MESSAGE(...);

但是您的程式碼中還有其他問題。至少COMMIT函式定義中的 會導致錯誤。

您可能需要重新設計和重寫您的程式碼。

引用自:https://dba.stackexchange.com/questions/246750