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

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

关于存储过程的优点:PG 官方也给了以下内容(其实这是存储过程的优点) 客户端和服务端之间额外的传输将被取消. 客户端不需要也不用客户端和服务端之间进行封装或者传输的中间结果。...可以避免命令的多轮解析在目前的PG11 中如果你要返回一个表的查询内容,从现在11到PG12,目前存储过程 是无法满足这个需求的。目前如果要通过函数来完成在一段PLPGSQL中输出某个表的集合。...上面是目前可以通过函数来完成调用表结果集的方式。...通过查阅资料,目前postgresql 的存储过程和函数之间的区别可以总结成1 存储过程中可以包含commit rollback2 函数可以有return 返回值输出3 存储过程支持 savepoint...; 结果如下,质疑在哪里,有些人认为在一个事务中表达的时间是一样的,而不应该是下面结果中的每运行一次就会更新一个时间。

3.9K30

Postgresql PLPGSQL 程序语言系列 1 (存储过程过时了吗,与函数)

其中提到, 以客户为中心的程序开发理论中总是将数据库与存储过程进行隔离, 其设计的目标通常是源于让应用程序来控制整个业务的逻辑,应用开发非常重要,而数据库则就是一个必须存在的"非必须"....下面就从POSTGRESQL 的函数开始, 四个部分 建立一个PG函数, 传递参数, 如何在内部控制函数, 从函数内部返回一个结果....Roybal',9,1); 上面的函数定义了, 传入的参数的数据类型,以及返回数据的类型,通过$$来界定存储过程$$ 并且在最下面标注上的函数的语言是plpgsql....通过return 来讲结果返回. 这里多说一句POSTGRESQL 的函数和存储过程,是可以通过其他语言来进行撰写, C ,PYTHON 等都是可以....当然有些程序中无度不区分应用场景使用存储过程和函数,造成性能问题,的另说, 但不能将其归罪与存储过程和函数本身,终究是使用的那些人的水平才应该是被.......

1.1K71
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    工作中可能会存在业务比较复杂,重复性工作比较多,需要批量处理数据的情况,此时使用存储过程会方便很多,存储过程的执行效率也会快很多,能帮助我们节省很多代码和时间。...PostgreSQL 概述 在 PostgreSQL 中,除了标准 SQL 语句之外,通过创建复杂的过程和函数来满足程序需要,我们称为存储过程和自定义函数(User-Defined Function)。...所有的 SQL 语句都存储在数据库服务器中,应用程序只需要发送函数调用并获取除了结果,避免了发送多个 SQL 语句并等待结果。 提高应用的性能。...因为自定义函数和存储过程进行了预编译并存储在数据库服务器中。 可重用性。存储过程和函数的功能可以被多个应用同时使用。 作为脚本使用,如产品的 liquibase 中, 清理或修复数据将非常好用。...一个函数体的完整文本必须是一个块。存储过程的语法如上所示。 在一个块中的每一个声明和每一个语句都由一个分号终止。 所有的关键词都是大小写无关的。

    4.1K21

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

    1 背景 PostgreSQL中的存储过程不支持使用savepoint、rollback to。...原因是PG的存储过程中,异常处理使用子事务来实现的,也就是一旦发生异常,当前procedure的begin块中执行过的所有语句都会直接回滚: procedure begin insert into...2 PLpgSQL中实现检查点的困难 由于PG异常处理本身会启动子事务,就等于启动检查点了,那么如果在begin块中再执行savepoint,会把PG的异常检查点从 事务堆栈顶层 向下压一层, 那么如果异常没发生...场景二:对于正常结果的block,如果执行rollback to函数外层savepoint,则已经把异常子事务提交了,高斯的处理是不提交异常子事务,异常子事务已经被rollback to路过回滚了。...场景三:对于正常结果的block,如果执行rollback to函数外层savepoint,且把SPI依赖的检查点也沿路回滚掉了,也没创建出来,会出现SPI挂到3号子事务上,但事务堆栈只有1、2号子事务的情况

    31620

    Postgresql源码(46)plpgsql中的变量类型及对应关系

    前文 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 plpgsql中的变量类型及对应关系...总结 1、PLpgSQL_datum.dtype共有5中类型,其中2中类型属于通用类型,覆盖pg_type中所有类型:由plpgsql_build_variable函数根据pg_type中查到的类型决定...场景一:trigger会默认创建一些变量用于记录触发中间态,例如tg_name、tg_when、tg_level、tg_op等,类型都是PLPGSQL_DTYPE_PROMISE 梳理过程 例如这样的几个变量...函数中构造,有pg_type系统表中对应类型的typtype列的值决定 PLpgSQL_type * plpgsql_build_datatype(Oid typeOid, int32 typmod,...场景一:trigger会默认创建一些变量用于记录触发中间态,例如tg_name、tg_when、tg_level、tg_op等,类型都是PLPGSQL_DTYPE_PROMISE

    1.2K10

    Postgresql自定义聚合函数入门案例

    但是执行起来不太直观,这里精简下他的CASE,打印出中间变量,语法和过程一目了然。...测试场景 有一张表保存了路程数据,现在表中记录了司机的两单数据,第一单ID=1记录了三段路程,需要合并计算。 价格计算规则是:起步价3.5,每公里2.2(要求可在SQL内更改),最后每单再四舍五入。...taxi_accum:对于同组的每一行,都调用一次(注意这里的后两个参数就是后面执行时,给AGG函数传入的两个参数) 参数一:上次一的结果; 参数二:当前行数据 参数三:执行时传进去的数据(看后面的...curr:(%) outer:(%) return:(%)', $1, $2, $3, $1 + $2 * $3; RETURN $1 + $2 * $3; END; $$ LANGUAGE 'plpgsql...taxi(km, 2.20)的两个参数直接传给sfunc的后两个参数,sfunc的第一个参数记录上一次计算的结果。 每组分别计算,每组最后调用finalfunc。

    83930

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

    ExprContext就够了,但是ExprContext会依赖EState结构才能创建出来,所以PL在执行时,plpgsql_exec_function函数需要传入EState结构,方便后面ExprContext...在SQL层的执行器中运行时状态使用EState记录,在PL中状态信息使用PLpgSQL_execstate结构记录。...PL中的函数会使用共享的EState结构用于创建ExprContext:shared_simple_eval_estate PL中的匿名块会使用私有的EState结构用于创建ExprContext...因为PL中的异常处理会自动启动子事务,为了让表达式计算申请的资源能和子事务一块释放,需要将ExprContext与子事务关联起来: 一旦子事务释放,在回调函数plpgsql_subxact_cb...函数: plpgsql_create_econtext 用于创建ExprContext结构,会主动使用EState(shared_simple_eval_estate)。

    69220

    Postgresql源码(49)plpgsql函数编译执行流程分析总结

    前文 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 《Postgresql源码(49)plpgsql...触发器等其他函数的执行过程大同小异,核心流程基本不变,就是多了几个默认工具变量。相比《Postgresql源码(46)plpgsql中的变量类型及对应关系》这篇总结更清晰简单。...(函数代码整理包装放到pg_proc系统表里面),在pl中要经历两大步骤:编译、执行 【pl编译】过程会重新把函数的代码从系统表中取出,用pl自己的pl_gram.y解析,识别语法结构中的各部分,包装成语法块...【pl执行】执行前会给相关变量赋值,执行时会for循环遍历语法块链表,根据语法块类型走不同分支;执行中可能经常会递归进入语法块,因为大部分语法结构可以互相包含,比如函数中的循环结构中包含判断。...datums;函数参数、返回值构造进入ns_top、datums;调用yacc解析语法树,并构造语法块list;所有信息拷贝到function结构体中;function记录到htab中;编译完成。

    1.2K20

    Postgresql快照堆栈ActiveSnapshot

    因为在事务中,有些行为是需要看到最新数据的,比如一个RR事务拿到一个快照后执行了一段时间,这时运行了一条CALL Func或触发器语句,开始进入函数的执行逻辑。...(); 例如存在上述两个函数,执行结果为: postgres=# truncate t_plpgsql_transaction_20230406_01; TRUNCATE TABLE postgres...=# call p_outter(); NOTICE: count: {1,2} NOTICE: count: {1,2,10,20} 那么如果在函数p_outter执行pg_sleep期间内,在另一个会话中插入一条数据后会发生什么...结果是: -- 并发会话执行 postgres=# INSERT INTO t_plpgsql_transaction_20230406_01 (a) VALUES (999); INSERT 0 1...p_outter(); NOTICE: count: {1,2} NOTICE: count: {1,2,999,10,20} 从结果可以看到,单条SQL call p_otter()中每次Call

    1.1K60

    HAWQ技术解析(十) —— 过程语言

    由于HAWQ只有函数而没有存储过程的概念,returns void可用来模拟没有返回值的存储过程。...正因如此,UDF的性能比不使用存储函数的情况会有很大提高。 消除了客户端与服务器之间的额外往复,只需要一次调用并接收结果即可。 客户端不需要中间处理结果,从而避免了它和服务器之间的数据传输或转换。...当这种函数用于查询中时,必须由查询本身指定返回的行结构。下面的例子使用动态SQL,返回结果集依赖于作为入参的查询语句。...如果一个函数的返回值被声明为多态类型,那么它的参数中至少应该有一个是多态的,并且参数与返回结果的实际数据类型必须匹配。...pg_proc系统表中,以下语句查看函数体,查询结果如图13所示。

    4.2K50

    Postgresql源码(41)plpgsql函数编译执行流程分析

    相关 《Postgresql源码(41)plpgsql函数编译执行流程分析》 《Postgresql源码(46)plpgsql中的变量类型及对应关系》 《Postgresql源码(49)plpgsql...,整体匹配后的结果会作为PLpgSQL_stmt_block结构记录在plpgsql_parse_result中。...ns_top装入函数名 【3】初始化128个PLpgSQL_datum 【4】初始化 出参数、入参数 【5】用plpgsql_build_datatype的结果构造variable,计入全局datum...2】解析参数声明部分 【】解析其他部分 【3】所有的结果在gram.y中一级一级的汇总到$$中,最后在父节点传给全局变量plpgsql_parse_result,所有节点都用List挂在body上。...; :【3】所有的结果在gram.y中一级一级的汇总到$$中,最后在父节点传给全局变量plpgsql_parse_result (pl_gram.y语法树截取) decl_datatype

    1.3K20

    Postgresql源码(79)plpgsql中多层调用时参数传递关键点分析(pl参数)

    相关 《Postgresql源码(77)plpgsql中参数传递和赋值(pl参数)》 《Postgresql源码(78)plpgsql中调用call proc()时的参数传递和赋值(pl参数)》...《Postgresql源码(79)plpgsql中多层调用时参数传递关键点分析(pl参数)》 总结 本篇回答下面问题 问题一:外层ExecuteCallStmt用什么构造参数列表fcinfo->...虽然不能直接return: 但是在C函数中还是能返回的。SQL函数直接把结果按列吐给out类型参数。...(&($$.initvarnos)); } ; 继续看plpgsql_add_initdatums函数:总结下逻辑,就是把所有PLPGSQL_DTYPE_VAR、PLPGSQL_DTYPE_REC...#22 0x00000000007b4c93 in main (argc=1, argv=0x16590d0) at main.c:209 过程: exec_stmt_call 第一步:从上次执行结果中拿值记录到

    1.3K20
    领券