首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ora2pg将oracle包迁移到postgres

使用ora2pg将oracle包迁移到postgres
EN

Database Administration用户
提问于 2019-09-02 10:03:15
回答 1查看 348关注 0票数 0

我使用ora2pg将oracle(12c)包迁移到postgres(EnterpriseDB10.5)。大多数函数都成功地运行了迁移。但是,包中多次引用的一个函数会导致错误。我给出了以下两个版本的代码: oracle

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

在从另一个函数中调用该函数时出现了问题,因为正在获取此错误。

代码语言:javascript
复制
[42601] ERROR: syntax error at or near "sms_package"

如何从postgres中的函数内部执行另一个函数。如何从另一个函数中调用该函数?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2019-09-02 11:06:58

由于sms_package.LOG_MESSAGE是PostgreSQL中的一个函数,所以必须在PL/pgSQL中使用PERFORM调用它:

代码语言:javascript
复制
PERFORM sms_package.LOG_MESSAGE(...);

但是您的代码中还有其他问题。至少芬兰定义中的COMMIT将导致错误。

您可能需要重新设计和重写代码。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/246750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档