当前位置:网站首页>Significant differences between Oracle and Postgresql in PLSQL transaction rollback
Significant differences between Oracle and Postgresql in PLSQL transaction rollback
2022-08-04 03:35:00 【mingjie73】
相关
《Oracle/Mysql迁移到PostgresqlTransaction rollback behavior differences and transformation methods》
《Oracle与Postgresql在PLSQLSignificant difference in internal transaction rollback》
This difference is very easy to makeOracle迁移到PGThere is a major difference in the business logic after that.
1 总结
先放总结
- Oracle:在PLSQLInside if statement execution fails,After entering the exception handler,PL程序正常退出.Then before the execution of the failed statementSQL
不会回滚,The execution results are submitted normally. - Postgresql:在PLPGSQLInside if statement execution fails,After entering the exception handler,PL正常退出.
那么整个PL内的所有SQL自动回滚,因为:- PG不支持PL内写SAVEPOINT (OracleThere is an implicit before each statementsavepoint)
- PLThe whole is packaged in one big transaction.
Oracle11g
https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#LNPLS598
2 测试用例Oracle11g
drop table employees;
create table employees(employee_id int, salary int, raise int, job_id varchar(16), last_name varchar(16), first_name varchar(16));
insert into employees values (1, 1000, 60, 'ST_CLERK', 'Geller', 'Rose');
insert into employees values (2, 2000, 100, 'ST_CLERK', 'Green', 'Rachel');
insert into employees values (3, 4000, 400, 'ST_AAAAA', 'Bing', 'Chanller');
insert into employees values (4, 6000, 630, 'AD_CLERK', 'Geller', 'Rose');
insert into employees values (5, 7000, 120, 'AD_DSFWR', 'Green', 'Rachel');
insert into employees values (6, 8000, 410, 'AD_AAAAA', 'Bing', 'Chanller');
DROP TABLE emp_name;
CREATE TABLE emp_name AS SELECT employee_id, last_name, salary FROM employees;
CREATE UNIQUE INDEX empname_ix ON emp_name (employee_id);
DECLARE
emp_id employees.employee_id%TYPE;
emp_lastname employees.last_name%TYPE;
emp_salary employees.salary%TYPE;
BEGIN
SELECT employee_id, last_name, salary
INTO emp_id, emp_lastname, emp_salary
FROM employees
WHERE employee_id = 1;
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (100, emp_lastname, emp_salary);
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (emp_id, emp_lastname, emp_salary);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('Insert was rolled back');
END;
/
select * from emp_name;
结果
3 测试用例Postgresql14
drop table employees;
create table employees(employee_id int, salary int, raise int, job_id varchar(16), last_name varchar(16), first_name varchar(16));
insert into employees values (1, 1000, 60, 'ST_CLERK', 'Geller', 'Rose');
insert into employees values (2, 2000, 100, 'ST_CLERK', 'Green', 'Rachel');
insert into employees values (3, 4000, 400, 'ST_AAAAA', 'Bing', 'Chanller');
insert into employees values (4, 6000, 630, 'AD_CLERK', 'Geller', 'Rose');
insert into employees values (5, 7000, 120, 'AD_DSFWR', 'Green', 'Rachel');
insert into employees values (6, 8000, 410, 'AD_AAAAA', 'Bing', 'Chanller');
DROP TABLE emp_name;
CREATE TABLE emp_name AS SELECT employee_id, last_name, salary FROM employees;
CREATE UNIQUE INDEX empname_ix ON emp_name (employee_id);
select * from emp_name;
DO $$DECLARE
emp_id employees.employee_id%TYPE;
emp_lastname employees.last_name%TYPE;
emp_salary employees.salary%TYPE;
BEGIN
SELECT employee_id, last_name, salary
INTO emp_id, emp_lastname, emp_salary
FROM employees
WHERE employee_id = 1;
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (100, emp_lastname, emp_salary);
INSERT INTO emp_name (employee_id, last_name, salary) VALUES (emp_id, emp_lastname, emp_salary);
EXCEPTION
WHEN others THEN
raise notice 'Insert was rolled back';
END$$;
select * from emp_name;
执行结果
边栏推荐
猜你喜欢

new Date将字符串转化成日期格式 兼容IE,ie8如何通过new Date将字符串转化成日期格式,js中如何进行字符串替换, replace() 方法详解

2022年最新海南建筑八大员(材料员)模拟考试试题及答案

自定义通用分页标签01

小程序+新零售,玩转行业新玩法!

6口全千兆二层网管型工业以太网交换机千兆2光4电光纤自愈ERPS环网交换机

Introduction to mq application scenarios

复现20字符短域名绕过

STM8S105k4t6c--------------点亮LED

跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利

如果禁用了安全启动,GNOME 就会发出警告
随机推荐
异步编程解决方案 Generator生成器函数、iterator迭代器、async/await、Promise
力扣(LeetCode)215. 数组中的第K个最大元素(2022.08.03)
目标检测-中篇
机器学习之视频学习【更新】
张量篇-应用案例
6-port full Gigabit Layer 2 network managed industrial Ethernet switch Gigabit 2 optical 4 electrical fiber self-healing ERPS ring network switch
MySQL 查询练习(1)
自定义通用分页标签01
Functions, recursion and simple dom operations
函数,递归以及dom简单操作
2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
Implementing a server-side message active push solution based on SSE
【源码】使用深度学习训练一个游戏
[Playwright Test Tutorial] 5 minutes to get started
机器学习模型的“可解释性”
SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropri
if,case,for,while
说说数据治理中常见的20个问题
数组相关 内容 解析
sql注入一般流程(附例题)