Postgresql
使用 ora2pg 將 oracle 包遷移到 postgres 問題
我正在使用 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
函式定義中的 會導致錯誤。您可能需要重新設計和重寫您的程式碼。