首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在plpgsql/postgresql中引发错误而不回滚

在plpgsql/postgresql中引发错误而不回滚是指在使用plpgsql语言编写的存储过程或函数中,当发生错误时,希望错误不会导致整个事务回滚,而是继续执行后续的语句。

在plpgsql中,可以使用异常处理机制来实现这个目的。异常处理机制允许我们捕获和处理特定类型的错误,而不是让它们中断程序的执行。

以下是一个示例,展示了如何在plpgsql中引发错误而不回滚:

代码语言:txt
复制
BEGIN
  -- 执行一些操作

  -- 检查错误条件
  IF some_condition THEN
    -- 引发一个自定义错误
    RAISE EXCEPTION 'This is a custom error message.';
  END IF;

  -- 继续执行后续的语句

  -- 提交事务
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    -- 处理异常
    -- 这里可以添加一些日志记录或其他处理逻辑
    -- 但不会回滚整个事务
    -- 如果不想处理异常,可以简单地重新引发它
    RAISE;
END;

在上面的示例中,如果满足条件 some_condition,则会引发一个自定义错误,并且不会回滚整个事务。相反,异常处理部分会捕获该错误,并可以进行一些处理操作,如记录日志或执行其他逻辑。

需要注意的是,异常处理机制只能在plpgsql中使用,而不能在普通的SQL语句中使用。此外,异常处理应该谨慎使用,只在必要的情况下使用,以避免隐藏错误或导致不可预料的行为。

对于plpgsql/postgresql中引发错误而不回滚的应用场景,可以是在某些特定条件下,希望在错误发生时继续执行后续的语句,而不中断整个事务。这可能是因为某些错误是可以容忍的,或者需要在错误发生时执行一些特定的逻辑。

腾讯云提供的与plpgsql/postgresql相关的产品是云数据库 PostgreSQL,它是一种基于云的关系型数据库服务,提供了高可用、高性能、可扩展的 PostgreSQL 数据库。您可以通过以下链接了解更多信息:

云数据库 PostgreSQL

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Postgresql不支持事务块调用plpgsql(多层exception、事务块有检查点)

前言 Postgresql使用子事务来实现EXCEPTION的功能,即在进入EXCEPTION的存储过程前,会自动起一个子事务,如果发生了异常,则自动回滚子事务,达成EXCEPTION的效果。...目前下面代码的rollback会直接报错不支持,但报错被exception掩盖了,所以后续的行为不再分析了。只是做一些记录。...第一次CALL事务块内,所以使用子事务ID3,第二次CALLp_transaction_caller的子事务内,所以使用子事务ID4。.../pgsrc/src/backend/main/main.c:200 2 回前后estate->eval_econtext的状态变化 注意到SPI_rollback后,使用plpgsql_create_econtext...(estate); return PLPGSQL_RC_OK; } 这里还是深层exec_stmt_rollback位置,执行真的rollback前: 现在有两层CALL: ExecuteCallStmt

64210

OracleMysql迁移到Postgresql事务回行为差异及改造方法

Mysql或Oracle迁移到Postgresql系产品后,经常会发生事务回导致的问题,具体问题一般都是类似于: 为什么我没rollback,我的事务就自己回滚了?...这里就不再贴报错了,我贴下单步调试的过程更容易理解 第一个差异点:事务内SQL报错后,再执行任何语句都会抛异常 报错后的事务内再执行查询,报PG的标准错误: org.postgresql.util.PSQLException...不可以,报错时事务已经回,虽然提交没有报错,但是写入的数据不会生效 commit后 数据没有写入: 迁移到Postgresql后如何改造?...方案一:PL/pgSQL 使用Postgresql提供的PL/pgSQL语法,将相关逻辑写入PG的函数,使用PG的EXCEPTION语法封装响应的处理逻辑,在业务代码调用函数即可保证事务不会中断。...https://www.postgresql.org/docs/9.1/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING [

1.1K30
  • Postgresql源码(50)语法解析时关键字判定原理(函数名不能使用的关键字为例)

    相关: 《Postgresql源码(44)server端语法解析流程分析》 《Postgresql源码(50)语法解析时关键字判定原理(函数名不能使用的关键字为例)》 关键字报错场景 关键字不出现...lex返回522后,yacc语法树没有匹配项了,返回错误。 [lex] NORMALIZE = 522 [yacc] if (!...core_yylex需要返回它遇到的标识符类型并将其值存储yylval,这些标识符gram.y定义: gram.y %token ABORT_P ABSOLUTE_P ACCESS...但其实很多也不会触发冲突,为了使用这些关键字,gram.y文件后面专门定义了几组语法规则: unreserved_keyword:可以用于任意命名场景,如果新增的关键字不会引发shift/reduce...增加方法:先确定新增关键字会不会造成语法冲突歧义等,加到上面5个list,然后根据能否用于表名、列名、as等场景,kwlist增加即可。

    77830

    --PostgreSQL 的存储过程怎么写 与 质疑

    PostgreSQL 的存储过程POSTGRESQL 11 有了改变,从统一的 create function 到 create procedure 到底能从中获得什么 1 支持了commit 和...可以避免命令的多轮解析目前的PG11 如果你要返回一个表的查询内容,从现在11到PG12,目前存储过程 是无法满足这个需求的。目前如果要通过函数来完成一段PLPGSQL输出某个表的集合。...当然POSTGRESQL 11 开始有的存储过程,查看一些建议和资料的时候,有以下一些需要注意的地方 1 创建trigger 目前如果想在触发后,如果执行函数或存储过程,建议延续之前版本,继续使用函数的方式...2 在有事务断点,或者需要设置回或者保存点的大型的SQL 程序集的情况下,建议使用 PROCEDURE 当然也有部分人对POSTGRESQL 的存储过程提出了异议,说他根本没有像其他的数据库有事务性...; 结果如下,质疑在哪里,有些人认为一个事务中表达的时间是一样的,不应该是下面结果的每运行一次就会更新一个时间。

    3.8K30

    openGauss子事务管理分析(PLpgSQL的异常子事务)

    1 背景 PostgreSQL的存储过程不支持使用savepoint、rollback to。...原因是PG的存储过程,异常处理使用子事务来实现的,也就是一旦发生异常,当前procedure的begin块执行过的所有语句都会直接回: procedure begin insert into...end; 当异常发生后,第二条insert没有执行到就跳转了,比较容易理解;但是第一条insert会被回,这种行为是PG特有的,和Oracle是有区别的,Oracle异常发生只会跳转,不会回也不存在子事务...总结 场景一:对于正常结束的block,如果执行过savepoint,则异常子事务savepoint子事务下面一层,高斯的处理是不提交异常子事务,就放在事务堆栈。...->subTransactionId; PG这个计数器是一直递增的,不能减小。

    26920

    Postgresql源码(103)PLpgSQL的表达式ExprContext

    如果发生异常了,那么eval_econtext会跟着RollbackAndReleaseCurrentSubTransaction子事务回释放。...1 PL运行时信息:PLpgSQL_execstate PostgreSQL的PLpg/SQL任何语句的运行,都需要记录运行时的状态信息。...SQL层的执行器运行时状态使用EState记录,PL状态信息使用PLpgSQL_execstate结构记录。...因为PL的异常处理会自动启动子事务,为了让表达式计算申请的资源能和子事务一块释放,需要将ExprContext与子事务关联起来: 一旦子事务释放,回调函数plpgsql_subxact_cb...eval_econtext = old_eval_econtext; } 如果发生异常了,那么eval_econtext会跟着RollbackAndReleaseCurrentSubTransaction子事务回释放

    64620

    OushuDB-PL 过程语言-声明

    因此,如果把now()赋予一个类型为timestamp的变量,那 么该变量的缺省值将为函数实际调用时的时间,不是函数预编译时的时间。3)....CONSTANT选项是为了避免该变量进入BEGIN块后被重新赋值,以保证该变量为常量。4). 如果声明了NOT NULL,那么赋予NULL数值给该变量将导致一个运行时错误。...声明段为参数变量定义别名。...行类型: 见如下形式的变量声明: table_name%ROWTYPE表示指定表的行类型,我们创建一个表的时候,PostgreSQL也会随之创建出 一个与之相应的复合类型,该类型名等同于表名,因此,我们可以通过以上两种方式来声明行类型的变...记录类型: 见如下形式的变量声明: 记录变量类似于行类型变量,但是它们没有预定义的结构,只能通过SELECT或FOR命令来获取实际的行 结构,因此记录变量在被初始化之前无法访问,否则将引发运行时错误

    1K20

    Postgresql快照堆栈ActiveSnapshot

    因为事务,有些行为是需要看到最新数据的,比如一个RR事务拿到一个快照后执行了一段时间,这时运行了一条CALL Func或触发器语句,开始进入函数的执行逻辑。...=# call p_outter(); NOTICE: count: {1,2} NOTICE: count: {1,2,10,20} 那么如果在函数p_outter执行pg_sleep期间内,另一个会话插入一条数据后会发生什么...代码CallStmt时判断procedure则拿新的快照,旧的入栈。 3 快照堆栈 实际上PGPushActiveSnapshot的用处非常多,例如创建索引、vacuum等等。...PG的快照和其他资源一样,生命周期也是严格跟随事务系统的,也就是事务提交、撤销、子事务提交、子事务撤销时,都会有快照的销毁或转移动作。...AtSubAbort_Snapshot:子事务回时,会遍历快照堆栈,把该子事务同层的快照直接释放掉。

    1K60

    Postgresql源码(53)plpgsql语法解析关键流程、函数分析

    相关 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql的变量类型及对应关系》 《Postgresql源码(49)plpgsql...函数编译执行流程分析总结》 《Postgresql源码(53)plpgsql语法解析关键流程、函数分析》 0-0 总结 plpgsql_yylex等价于server端的base_yylex,都是lex...plpgsql_parse_word/plpgsql_parse_dblword/plpgsql_parse_tripword 调用场景:一/二/三个单词的场景,函数声明总是返回T_WORD 功能:...,启用PLword *word T_DATUM例子:上面用例的i3 = -1;,i3已经定义过ns中了,所以在后面遇到i3就有意义了。...3 plpgsql_parse_word/plpgsql_parse_dblword/plpgsql_parse_tripword 调用场景:一/二/三个单词的场景,函数声明总是返回T_WORD 功能

    98740

    调用PostgreSQL存储过程,找不到函数名的问题

    PostgreSQL的表,函数名称都是严格区分大小写的,所以使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题。...BEGIN   update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;   --return 1; END; $BODY$   LANGUAGE plpgsql...BEGIN   update JJZB set gzd=COALESCE(gzd,0)+1 where JJZB.Jjdm=$1 ;   --return 1; END; $BODY$   LANGUAGE plpgsql...问题影响: WFT,所有使用.NET程序调用PostgreSQL存储过程的代码,如果存储过程的参数使用了自定义的类型(例如citex),均会受影响。...解决方案: a,建议不要在PostgreSQL函数的参数中使用自定义的类型,如果要想对参数进行大小写转换,建议函数体中使用另外一个Pgsql变量,函数执行查询的SQL语句使用这个新变量,不是直接使用这个函数参数

    1.9K50

    进阶数据库系列(十一):PostgreSQL 存储过程

    PostgreSQL 概述 PostgreSQL ,除了标准 SQL 语句之外,通过创建复杂的过程和函数来满足程序需要,我们称为存储过程和自定义函数(User-Defined Function)。...一个块的每一个声明和每一个语句都由一个分号终止。 所有的关键词都是大小写无关的。除非被双引号引用,标识符会被隐式地转换为小写形式,就像它们普通 SQL 命令。...; 提示信息 官方文档:http://postgres.cn/docs/12/plpgsql-errors-and-messages.html 使用raise语句报告消息以及抛出错误,上面给的示例已经有部分给出...游标是 PL/pgSQL 的一个强大的数据处理功能,更多的使用方法可以参考官方文档:https://www.postgresql.org/docs/current/plpgsql-cursors.html...事务管理 存储过程内部,可以使用 COMMIT 或者 ROLLBACK 语句提交或者回事务。

    2.9K21

    Oracle与PostgresqlPLSQL内事务回的重大差异

    相关 《Oracle/Mysql迁移到Postgresql事务回行为差异及改造方法》 《Oracle与PostgresqlPLSQL内事务回的重大差异》 这个差异点非常容易造成Oracle...1 总结 先放总结 Oracle:PLSQL内如果语句执行失败,进入异常处理程序后,PL程序正常退出。那么执行失败语句前面的SQL不会回,执行结果都正常提交了。...PostgresqlPLPGSQL内如果语句执行失败,进入异常处理程序后,PL正常退出。...那么整个PL内的所有SQL自动回,因为: PG不支持PL内写SAVEPOINT (Oracle每个语句前有隐式的savepoint) PL整体包装在一个大事务内。...THEN DBMS_OUTPUT.PUT_LINE('Insert was rolled back'); END; / select * from emp_name; 结果 3 测试用例Postgresql14

    56510

    Postgresql源码(80)plpgsql异常处理编译与执行流程分析(sqlstate)

    相关 《Postgresqlplpgsql异常处理方法与实例(RAISE EXCEPTION)》 《Postgresql源码(80)plpgsql异常处理编译与执行流程分析(sqlstate)...->condname = yylval.word.ident 第三步:识别单词含义,去exception_label_map字符串数组匹配名字,下面介绍这个数组 plpgsql_recognize_err_condition..."division_by_zero", message = 0x0, params = 0x0, options = 0x0} exception_label_map数组 保存{错误名...,错误码}的数组,例如division_by_zero: typedef struct { const char *label; int sqlerrstate; } ExceptionLabelMap...} 2.3 语法树匹配:proc_condition 进入plpgsql_parse_err_condition返回exception_label_map数组的匹配元素: PLpgSQL_condition

    42610

    Postgresql源码(93)Postgresql函数内事务控制实现原理(附带Oracle对比)

    相关 《Postgresql源码(60)事务系统总结》 《Postgresql源码(93)Postgresql函数内事务控制实现原理(附带Oracle对比)》 0 总结 Postgresql...区别是:Postgresql目前还不支持事务块内,调用带有commit的函数;Oracle是支持的。 (即显示begin启动事务,调用带有commit的函数) 还有游标部分也有一些差别。...1 Postgresql函数内事务控制介绍 PATCH:8561e4840c81f7e345be2df170839846814fa004 增加了plpgsql事务控制的功能,即实现在plpgsql内执行...2 Postgresql实现函数内事务控制的源码分析 PATCH函数调用的入口增加了atomic变量 ExecuteCallStmt(ParseState *pstate, CallStmt *stmt...standard_ProcessUtility函数IsTransactionBlock() plpgsql_call_handler函数fcinfo->context plpgsql_call_handler

    1K20

    【项目实战经验】一文搞懂云数据库PostgreSQL与MySQL实践案例

    腾讯云云数据库 PostgreSQL 简介云数据库 PostgreSQL 能够让您在云端轻松设置、操作和扩展目前功能最强大的开源数据库 PostgreSQL,腾讯云将负责绝大部分处理复杂耗时的管理工作...,如 PostgreSQL 软件安装、存储管理、高可用复制、以及为灾难恢复进行的数据备份,让您更专注于业务程序开发。...Tinyint(1)可以存储的最大值为127,Tinyint(4)可以存储的最大值为9999。这意味着,如果使用Tinyint(1)存储大于127的值,将会出现溢出的情况,导致数据错误。...name VARCHAR(100) NOT NULL, quantity TINYINT(4) NOT NULL);项目报错实际由于估测场景缺失,造成未评估字段长度报错,改为int后又再次上线解决未引发错误...这个例外是unchecked,如果遇到checked意外就不回

    91630

    PostgresqlRR级别(可重复读)不会出现幻读

    Postgresql对比Mysql一个重要的差一点就在于Phantom Read,Mysql的RR级别下,幻读是可以出现的,下面构造一个场景来说明这个问题。...INSERT 0 1 insert into tbl1 values (3, 'geller'); 注意,这里会直接报主键冲突,但是事务并不回...上述场景的差异:MYSQL发生了幻读,PG会等待其他事务的行为进而作出不同的相应: 其他事务提交:为避免幻读直接回当前事务 其他事务回:正常提交 PG对于事务行为有更为苛刻的保证,使用回的方式避免幻读...INSERT 0 1 insert into tbl1 values (3, 'geller'); 注意,这里会直接报主键冲突,但是事务并不回...上述场景的差异:MYSQL发生了幻读,PG会等待其他事务的行为进而作出不同的相应: 其他事务提交:为避免幻读直接回当前事务 其他事务回:正常提交 PG对于事务行为有更为苛刻的保证,使用回的方式避免幻读

    63420
    领券