oracle数据库中如何进行推送(Oracle应用迁移到AnalyticDBforPostgreSQL指导)
oracle数据库中如何进行推送(Oracle应用迁移到AnalyticDBforPostgreSQL指导)例如:对于oracle的procedure和function,不论是package的还是全局的,都转换成adb for pg 的function。例如:create or replace package pkg is … end; 可以转换成:create schema pkg; Package定义的变量 procedure/function的局部变量保持不变,全局变量在ADB for PG中可以使用临时表进行保存。详见1.4.5节。 Package初始化块如果可以删掉,就删掉,删不掉的话,可以使用function封装,在需要的时候主动调用该function。 Package 内定义的procedure/functionPackage 内定义的procedure和function 转成adb for pg的function,并把function 定义到package对应的schema内。
AnalyticDB for PostgreSQL(简称:ADB for PG)对Oracle语法有着较好的兼容,本文介绍如何将Oracle应用迁移到AnalyticDB for PostgreSQL。
1 PL/SQLPL/SQL(Procedural Language/SQL)是一种过程化的SQL语言,是Oracle对SQL语句的拓展,使得SQL的使用可以具有一般编程语言的特点,因此,可以用来实现复杂的业务逻辑。PL/SQL对应了ADB for PG中的PL/PGSQL
1.1Package
ADB for PG的plpgsql不支持package,需要把package 转换成 schema,并package里面的所有procedure和 function转换成ADB for PG的function。
例如:
create or replace package pkg is … end;
可以转换成:
create schema pkg;
- Package定义的变量
procedure/function的局部变量保持不变,全局变量在ADB for PG中可以使用临时表进行保存。详见1.4.5节。
- Package初始化块
如果可以删掉,就删掉,删不掉的话,可以使用function封装,在需要的时候主动调用该function。
- Package 内定义的procedure/function
Package 内定义的procedure和function 转成adb for pg的function,并把function 定义到package对应的schema内。 例如,有一个Package名为pkg中有如下函数: FUNCTION test_func (args int) RETURN int is var number := 10; BEGIN … … END; 转换成如下ADB for PG的function: CREATE OR REPLACE FUNCTION pkg. test_func(args int) RETURNS int AS $$ … … $$ LANGUAGE plpgsql;
1.2 Procedure/function
对于oracle的procedure和function,不论是package的还是全局的,都转换成adb for pg 的function。
例如:
CREATE OR REPLACE FUNCTION test_func (v_name varchar2 v_version varchar2) RETURN varchar2 IS ret varchar(32); BEGIN IF v_version IS NULL THEN ret := v_name; ELSE ret := v_name || '/' || v_version; END IF; RETURN ret; END;
转化成:
CREATE OR REPLACE FUNCTION test_func (v_name varchar v_version varchar) RETURNS varchar AS $$ DECLARE ret varchar(32); BEGIN IF v_version IS NULL THEN ret := v_name; ELSE ret := v_name || '/' || v_version; END IF; RETURN ret; END; $$ LANGUAGE plpgsql;
Procedure/function转换的关键点:
- RETURN 关键字转成RETURNS
- 函数体使用$\$ ... $\$封装起来
- 函数语言声明
- Subprocedure需要转换成ADB for PG的function
1.3 PL statement
1.3.1 For语句
带有REVERSE的整数FOR循环的工作方式不同:PL/SQL中是从第二个数向第一个数倒数,而PL/pgSQL是从第一个数向第二个数倒数,因此在移植时需要交换循环边界。
3 数据类型转换对照表作者:陆封