Postgresql中有关plpgsql异常处理的一切(RAISE EXCEPTION)
本文将分别在openGauss/MogDB和PostgreSQL数据库中测试存储过程commit与exception的使用。
Postgresql支持变长参数传递,参数被自动转换为数据传入函数体中,类似C语言的可变参数:int sum(int num_args, ...)。
对于事务系统来说,内层函数、外层函数都在一个事务中,内层提交就等于把事务提交了,所以外层数据也在。
Postgresql中支持两种行类型,两种类型使用上有一些区别,本篇结合实例简单介绍。
进入plpgsql_parse_err_condition返回exception_label_map数组中的匹配元素:
游标一般适用于大结果集,大结果集在内存中放不下 且 数据可以一条一条处理的情况 比较适合使用游标。
– 把before for each row的触发器删掉, 再测试插入 : postgres=# drop trigger tg02 on t_ret; DROP TRIGGER postgres=# drop trigger tg2 on t_ret; DROP TRIGGER postgres=# insert into t_ret values(1,’digoal’,now()); NOTICE: 00000: tg01 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg1 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg03, after for each row 的触发器函数返回空, 不影响后续的触发器是否被调用. 因为只要表上面发生了真正的行操作, after for each row就会被触发, 除非when条件不满足. (这个后面会讲到) LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg3 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg04 LOCATION: exec_stmt_raise, pl_exec.c:2840 NOTICE: 00000: tg4 LOCATION: exec_stmt_raise, pl_exec.c:2840 INSERT 0 1 – 有数据插入. 这也说明了before for each statement的返回值为空并不会影响数据库对行的操作. 只有before for each row的返回值会影响数据库对行的操作. postgres=# select * from t_ret ; id | info | crt_time —-+——–+—————————- 1 | digoal | 2013-03-10 16:50:39.551481 (1 row)
工作中可能会存在业务比较复杂,重复性工作比较多,需要批量处理数据的情况,此时使用存储过程会方便很多,存储过程的执行效率也会快很多,能帮助我们节省很多代码和时间。
curs4的在exec_stmt_open中被创建出来,创建时使用CreatePortal返回一个游标Portal:
PL/pgSQL是一种块结构语言,函数定义的所有文本都必须在一个块内,其中块中的每个声明和每条语句 都是以分号结束,如果某一子块在另外一个块内,那么该子块的END关键字后面必须以分号结束,不过 对于函数体的最后一个END关键字,分号可以省略,如: [ <<label>> ]
在PostgreSQL中,该函数用于打印字符串,类似于Java中的System.out.println(),Oracle中的dbms_output.put_line()。
总结:函数入参赋值是遍历datums中需要值的变量,然后按顺序拿fcinfo->args数组的值。
这篇写的细节比较多有点乱,大体流程和总结可以看第三、四篇 《Postgresql源码(49)plpgsql函数编译执行流程分析总结》和《Postgresql源码(53)plpgsql语法解析关键流程、函数分析》
下面表格中列举了一些异常场景,无论执行哪种JAVA中都会抛出SQLException,在异常处理中可以通过三种接口拿到错误信息:
Postgresql的plpgsql提供了一套钩子函数支持运行时动态加载,非常便于调试plpgsql。本文总结使用方法和实例。
1、编译过程主要是pl_gram.y做语法匹配的过程plpgsql_yyparse,整体匹配后的结果会作为PLpgSQL_stmt_block结构记录在plpgsql_parse_result中。
AtSubCommit_Portals(mySubid=4) 开始处理portal:
How to understand differences between ROWTYPE, TYPE, and RECORD in postgresql? Official documentatio
因为在事务中,有些行为是需要看到最新数据的,比如一个RR事务拿到一个快照后执行了一段时间,这时运行了一条CALL Func或触发器语句,开始进入函数的执行逻辑。
所有在块里使用的变量都必须在块的声明段里先进行声明,唯一的例外是FOR循环里的循环计数变量, 该变量被自动声明为整型。变量声明的语法如下: variable_name [ CONSTANT ] variable_type [ NOT NULL ] [ { DEFAULT | := } expression ];
有一个讲自定义聚合函数入门非常好的例子: https://www.cybertec-postgresql.com/en/writing-your-own-aggregation-functions/
整理plpgsql_Datums(解析后的变量)("无"表示该类型没有这个配置项)
psql交互式词法解析流程分析 交互式词法解析的经典代码框架,需要自己写个交互式小工具可以用psql当模板,快速上手lex 全篇分析三类SQL的解析过程,见大标题和里面的用例。 1 MainLoop流程抽象:“select 1;” select 1; psql/mainloop.c MainLoop(FILE *source) ... /* 交互式拿到单行SQL */ /* line: "select 1;" */ line = gets_interactive(get_prompt(prom
psql交互式词法解析流程分析 交互式词法解析的经典代码框架,需要自己写个交互式小工具可以用psql当模板,快速上手lex 0 总结 psqlscan_emit函数是psqlscan.l中的ECHO宏,负责匹配词法后,把数据整理到PsqlScanState->output_buf中。 基本所有的语法匹配完了都会调psqlscan_emit,所以调试语法树挂这个函数。 语法解析时不太好调试的是当前状态字的转换,可以在函数入参中增加YY_START宏查看当前状态: * <xb> bit string
函数调用时在语义分析阶段,transform函数对函数入参进行分析,直观上需要完成几步工作:
本文探索raise notice 'sqlstate: %', sqlstate;时,%的值是怎么拿到的。
PostgreSQL 的存储过程在POSTGRESQL 11 有了改变,从统一的 create function 到 create procedure 到底能从中获得什么
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。
很高兴,我在本周早些时候完成了我的第一个Kaggle比赛。和富有经验的高手合作进行时间序列分析是非常酷的,而且我确确实实在时间序列处理上学到了很多东西。不仅如此,我还熟悉了天文方面的数据,了解了超新星以及人类研究这些天体所用到的方法(参加kaggle比赛会给你带来另一些影响,那就是你们可以非常具体地了解不同行业中的问题)。
近日,约翰霍普金斯大学天体物理学教授Brice Ménard等人完成了一张全新的交互式宇宙地图,记录了137亿光年内20余万天体。
在数据泄露事件频发、网络威胁不断升级的当下,“HVV行动”应运而生,“红蓝对抗演练”成为了组织用来测试网络系统安全、修复薄弱环节的常用手段,信息安全攻防演练,既巩固了信息安全基础,也促进了各专业信息安全整体水平的显著提升。 知己知彼、以攻促御! 4月19日(周三)下午15:00,「炼石计划@渗透红队攻防」帮主小乐,将为大家带来主题为《攻防演练规则解读及透视攻方视角》的分享,通过解读2022网络安全攻防演练规则与攻击方视角的攻防演练全流程,让大家更好的去了解攻防对抗,帮助大家针对自身情况,查漏补缺、扩宽知识面
问题一:外层ExecuteCallStmt用什么构造参数列表fcinfo->args? 问题二:外层ExecuteCallStmt如何fcinfo->args构造流程? 问题三:内层ExecuteCallStmt用什么构造fcinfo->args? 问题四:内层ExecuteCallStmt如何fcinfo->args构造流程? 问题五:exec_stmt_block刚进入初始化哪些变量? 问题六:exec_stmt_block刚进入为什么要初始化哪些变量直接用不行吗? 问题七:内层函数执行完的变量是在哪赋给外层的?
晓查 明敏 发自 凹非寺 量子位 | 公众号 QbitAI 你知道吗?在地球上,楼层越低,时间过得越慢。 这可不是玄学,而是爱因斯坦广义相对论预言的时间膨胀效应:引力越大,时间越慢。 △ 在不同高度差上验证时钟变快(图片来自Nature) 今天Nature封面的一篇文章证明了,即使高度差只有一毫米,时间流逝的速度也不一样,这是迄今为止在最小尺度上验证广义相对论的实验。 该研究来自于美国科罗拉多大学JILA实验室的叶军团队。 他率团队开发出世界上最精确的原子钟,得出在一毫米高度差上,时间相差大约一千亿亿
三色旗 说明: 三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而大多数 的作者则使用Three-Color Flag来称之。假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这份动作,而且一次只能调换两个色旗子。 解法: 在一条绳子上移动,在程式中也就意味着只能使用一个阵列,而不能使用其他的阵列来作辅助,问题的解法很简单 您可以自己想像一下在移动旗子,从绳子开头进行,遇到蓝色往前移,遇到白色留在中间,遇到红色往后移,如下 所示:只是要让移动的次数最少的话, 就要有些技巧:1.如果图中W所在位置为白色,则W+1, 表示未处理的部分移至白色群组。2.如果W部分为蓝色, 则B与W的元素对调,而B与W必须各 +1, 表示两个群组都多了一个元素。 2.如果W所在的位置是红色,则将W与R交换,但R要减 1,表示未处理的部分减 1. 注意B,W,R并不是三色旗的个数,它们只是一个移动的指标;什么时候移动结束呢?一开始时未处理的R指标会是 等于旗子的总数,当R的索引数减至少于W的索引数时,表示接下来的旗子就是红色了,此时就可以结束移动,如下所示:
Thoughts on Chinese Safe Harbor Rules ——Shared by Doctor Si, Xiao at Stanford Law School, 2014 腾讯公司副总法律顾问,互联网与社会研究院秘书长司晓博士,应美国版权法权威Paul Goldstein教授的邀请在斯坦福大学法学院版权法的课堂上和同学们做了关于中国版权法避风港规则的分享,以下为后期整理的演讲实录。 Hi, everyone, my name is Jason. Thanks for Prof
不在执行exec_prepare_plan直接执行exec_dynquery_with_params:
在微环调制器中,如果输入功率过高,观测到的光谱将会如下图所示,而不是左右对称的Lorenz型。当输入光功率逐渐增大时,光谱变得左右不对称。
历史拉链表,就是记录一个事务从开始一直到当前状态的所有变化的信息,拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。
不包括全部内容 基础部分包括大O记号和小o记号的意义,P问题和NP问题和NP hard问题 B树和B+树 AVL平衡树和红黑树 KMP
调用SPI_execute_plan_extended执行后,可以看到tstore中有了两条结果。
《Postgresql源码(77)plpgsql中参数传递和赋值(pl参数)》 《Postgresql源码(78)plpgsql中调用call proc()时的参数传递和赋值(pl参数)》 总结 调用者在exec_stmt_call中拼接ParamListInfo传给SPI去执行call xxxx命令。 ParamListInfo记录了PL的一些回调函数,在SPI会走到:ExecuteCallStmt ExecuteCallStmt核心流程两步: 拼参数列表:会拿到所有入参 假设第一个入参是
syslog模块是在unix环境下工作的模块,不能用于windows,在windows环境下可以使用logging模块。syslog模块可以用于记录系统运行的信息,这个模块提供的方法有,syslog(priority,message),它将message送入系统日志,priority的默认选项为LOG_INFO,openlog([ident[,logoption[,facility]]]),它用于打开日志,ident会被加到每条日志,logoption是日志选项,facility是可选工具参数。closelog()用于关闭日志。
例如上述PL在执行时调用plpgsql_recognize_err_condition的传参:
从正在进行中的有计划的实验中,有各种各样的组合可以很好地探索宇宙,从难以想象的小基本粒子世界到令人敬畏的宇宙规模。诸如大型强子对撞机(Large Hadron Collider,LHC)和大型天气观测望远镜(Large Synoptic Survey Telescope ,LSST)之类的实验可提供大量数据,可与特定理论模型的预测进行比较。这两个领域都有完善的物理模型作为基础假设:粒子物理和 CDM宇宙学的标准模型,其中包括冷暗物质和宇宙常数 。有趣的是,所考虑的大多数其他假设都是在相同的理论框架中提出的,即量子场论和广义相对论。
首先向大家致歉,最近这段时间工作比较忙,没太多时间写公众号,距离上一篇笔记已经半个多月了,十分抱歉。还是不能停下来。
PostgreSQL中的存储过程不支持使用savepoint、rollback to。原因是PG的存储过程中,异常处理使用子事务来实现的,也就是一旦发生异常,当前procedure的begin块中执行过的所有语句都会直接回滚:
领取专属 10元无门槛券
手把手带您无忧上云