从Oracle迁移到Azure DB(PostgreSQL):了解Oracle和PostgreSQL的12个差异的重要知识
以下是关于从Oracle Database迁移到PostgreSQL时两者之间重要差异的描述。
1. 存储架构的差异
2. 交易的差异 de
PostgreSQL默认自动提交
对于已经熟悉使用Oracle数据库的工程师来说,PostgreSQL的自动提交是一个相对陌生的特点。在Oracle数据库中,执行完Insert、Delete、Update等DML操作后,必须显式地执行COMMIT才能将更改反映出来,如果想要撤销更改,还需要显式地执行ROLLBACK。而在PostgreSQL中,执行DML操作后,更改会立即生效,自动提交。如果想要将其作为一个事务进行执行,需要显式地使用BEGIN来启动事务,要提交事务则需要使用END或COMMIT,要进行回滚则需要执行ROLLBACK。
在PostgreSQL中,DDL操作也可以进行回滚。
在Oracle数据库中,DDL语句会进行隐式提交。而在PostgreSQL中,由于不执行隐式提交,因此可以回滚像在事务中执行的CREATE TABLE这样的DDL语句。
在交易过程中对错误的控制。
duì de
在Oracle数据库中,即使在执行了一些DML操作时出现错误,只要在最后进行COMMIT操作,那么被成功执行的DML操作的处理就会被确认。而在PostgreSQL中,如果在BEGIN之后出现了任何错误,即使最后进行了COMMIT操作,处理结果会被视为执行了ROLLBACK操作一样。
3. 定义差异(数据类型规定)
4. 数据连续生成
在生成连续数字时,Oracle Database和PostgreSQL都有序列(sequence)和自动递增列的功能存在。然而,它们的表示方法略有不同。
START WITH 1 INCREMENT BY 1;CREATE TABLE test
(testno NUMBER GENERATED ALWAYS AS IDENTITY);PostgreSQLCREATE SEQUENCE deptseq
START WITH 1 INCREMENT BY 1;CREATE TABLE test (testno SERIAL);
5.同义词的有无
在Oracle数据库中,存在同义词,但在PostgreSQL中却不存在。因此,在PostgreSQL中需要将Oracle数据库中的同义词替换为视图。
Oracle Databaseパブリックシノニム/プライベートシノニムPostgreSQLシノニムは存在しない
6. 包裝、過程
在PostgreSQL中,没有包(package)的概念。然而,有多种类型的存储过程(procedure)可用,如PL/pgSQL、PL/Python、PL/Perl等。因此,可以将Oracle Database中的存储过程更改为这些选项之一。
7. 内置函数
Oracle Database和PostgreSQL的内置函数有所不同。由于在移植到PostgreSQL时,某些在Oracle Database中可用的内置函数可能不存在,因此需要注意。(如果不存在相应的内置函数,则需要定义实现相同功能的自定义函数。)
通过引入orafce插件,可以在PostgreSQL内实现与Oracle数据库兼容的函数。(并非全部函数)
8. 外部合作
Oracle数据库使用(+)作为外连接的独特表示方法(尽管在Oracle 9i之后,这种表示方法已不推荐使用)。
而在PostgreSQL中,不存在(+)符号,因此需要将其转换为[LEFT/RIGHT] OUTER JOIN。
Instead of repeating numbers, let’s just use Roman numerals.
--Oracle Databaseの場合
SELECT d.deptno, d.dname, e.empno, e.ename, e.comm
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno
AND e.comm(+) = 300;
--PostgreSQLの場合
SELECT d.deptno, d.dname, e.empno, e.ename, e.comm
FROM scott.emp e
RIGHT OUTER JOIN scott.dept d ON (e.deptno = d.deptno AND e.comm = 300);
只需要一种选项, 进行以下中文的同义改写:
例②
--Oracle Databaseの場合
SELECT d.deptno, d.dname, e.empno, e.ename, e.comm
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno
AND e.comm = 300;
--PostgreSQLの場合
SELECT d.deptno, d.dname, e.empno, e.ename, e.comm
FROM scott.emp e
RIGHT OUTER JOIN scott.dept d
ON (e.deptno = d.deptno)
WHERE e.comm = 300;
9.行级锁
为了避免由于共享而导致的一般业务逻辑上的不一致,一般有使用SELECT FOR UPDATE。在Oracle数据库和PostgreSQL中,都存在SELECT FOR UPDATE操作,可以以相同的方式获取行级锁。然而,在Oracle数据库中,可以使用FOR UPDATE子句中的WAIT n和NOWAIT,但在PostgreSQL中,虽然存在FOR UPDATE子句,但不存在WAIT n和NOWAIT(一直等待直到锁被释放)。可以通过指定参数lock_timeout来设置超过设定值的等待时间导致错误,因此需要通过调整这个参数来进行设置(这个参数也可以在会话级别进行更改)。
10个提示
Oracle数据库有提示语句,但在PostgreSQL中没有提示语句。(虽然存在”pg_hint_plan”作为扩展功能,但没有Oracle数据库那么多种类)
※”pg_hint_plan”在Azure Database for PostgreSQL中不存在。
11. 空
在Oracle Database中,NULL和空字符串被视为相同的东西(NULL)。
而在PostgreSQL中,NULL和空字符串被视为不同的东西。因此,如果要将Oracle Database迁移到PostgreSQL,建议设置使用NULL或空字符串的哪一个的规范,例如禁止使用其中之一。
在进行NULL的四则运算或与NULL进行字符串连接时,结果都会变为NULL,因此在处理可能存储NULL的列时,需要使用COALESCE函数(相当于Oracle Database中的NVL函数)等技巧。
合并
在Oracle Database中,存在着MERGE语句(如果存在就更新,否则插入),但在PostgreSQL中,却没有MERGE语句。与此相反,PostgreSQL提供了UPSERT(插入冲突)语句,因此我们可以使用它来替代。
最后
我希望能向大家介绍一下关于Oracle数据库和PostgreSQL之间的差异,在迁移时需要注意的要点。
下次
我想介绍Azure Database for PostgreSQL的功能。