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

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

结果如下: 返回多条数据 到目前为止,现在返回的结果要不是返回空要不就是返回一个记录,若是想要多条数据该怎么处理呢?...当被返回setof sometype时,函数最后一个查询执行完后输出的每一行都会被作为结果集的一个元素返回。 sometype可以是某一张已经存在的表,也可以是record。也可以是某个字段类型。...游标允许我们封装一个查询,然后每次处理结果集中的一条记录。...游标可以将大结果集拆分成许多小的记录,避免内存溢出;另外,我们可以定义一个返回游标引用的函数,然后调用程序可以基于这个引用处理返回的结果集。...VOLATILE COST 100 案例四:为了使函数更加通用,以解决动态返回数据集的问题,将表名作为参数传进去。

4.1K21

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

,并返回channel表的记录数,函数的调用结果如图1所示。...函数返回最后一条查询语句的结果,即parent_id=-1的记录数,调用结果如图2所示。 ?...每条SQL语句由数据库服务器独立执行模式下,客户端应用向数据库服务器发送一个查询请求后,必须等待处理完毕,接收处理结果,做相应的计算,然后再向服务器发送后面的查询。...返回结果集的函数通过执行RETURN NEXT语句生成一条返回的记录(与PostgreSQL不同,HAWQ函数不支持RETURN QUERY语法)。        ...图3 四、表函数         表函数返回多行结果集,调用方法就像查询一个from子句中的表、视图或子查询。如果表函数返回单列,那么返回的列名就是函数名。

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

    Postgresql RECORD与%ROWTYPE类型

    1 实例分析 ROWTYPE Postgresql使用plpgsql定义函数时,支持定义行类型,即可以完全继承表的行定义: row1 table1%ROWTYPE; row2 table2%ROWTYPE...,也就是按照 查询结果中的列名(或列名as 别名)来定义record具体的字段名。...ROWTYPE实例 从实例结果来看有两点结论: ROWTYPE变量内部字段名不会受结果集影响,与表字段保持一致 ROWTYPE变量内部字段的赋值,是按结果集顺序赋值的,与结果集中的字段名无关 drop...: RECORD变量内部字段名会受结果集影响,字段名与结果集保持一致 RECORD变量内部字段的赋值,也是按结果集顺序赋值的 drop table tf1; create table tf1(c1 int...ROWTYPE用的表的tupledesc,RECORD用 的是SPI返回值的desc:SPI_tuptable->tupdesc %ROWTYPE与RECORD相同点: 都是用PLpgSQL_rec的expand

    1.1K20

    CMU 15-445 -- Embedded Database Logic - 12

    这张表是一个只读查询的结果集,可以被其它查询引用。...它不包含实际数据,而是根据与视图相关联的查询来生成结果。每当查询引用该视图时,视图将立即执行,并返回查询结果。...与普通视图不同,物化视图实际上存储了视图的结果集,而不是每次查询时动态生成。这使得物化视图能够在查询时更快地返回结果,因为它们避免了每次查询都执行复杂的计算。...物化视图的特点如下: 存储实际数据:物化视图将视图的结果集存储在磁盘上,以表的形式存在。因此,当查询物化视图时,它会直接从磁盘中获取数据,而不是每次执行查询时都重新计算结果。...物化视图通常在数据仓库和大型数据集的环境中使用,以加速复杂查询的执行。

    26140

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

    客户端不需要也不用客户端和服务端之间进行封装或者传输的中间结果。 可以避免命令的多轮解析在目前的PG11 中如果你要返回一个表的查询内容,从现在11到PG12,目前存储过程 是无法满足这个需求的。...目前如果要通过函数来完成在一段PLPGSQL中输出某个表的集合。...上面是目前可以通过函数来完成调用表结果集的方式。...通过查阅资料,目前postgresql 的存储过程和函数之间的区别可以总结成1 存储过程中可以包含commit rollback2 函数可以有return 返回值输出3 存储过程支持 savepoint...当然在POSTGRESQL 11 开始有的存储过程,在查看一些建议和资料的时候,有以下一些需要注意的地方 1 在创建trigger 中目前如果想在触发后,如果执行函数或存储过程,建议延续之前版本,继续使用函数的方式

    3.9K30

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

    函数编译执行流程分析总结》 以一个带简单赋值、出入参、变量有默认值的普通函数为例,分析执行过程。...(函数代码整理包装放到pg_proc系统表里面),在pl中要经历两大步骤:编译、执行 【pl编译】过程会重新把函数的代码从系统表中取出,用pl自己的pl_gram.y解析,识别语法结构中的各部分,包装成语法块...,然后把语法块串在链表上返回链表头,后面执行的时候遍历链表即可;还有一部分功能是维护datums数组和ns_top链表,分别记录了运行时需要的变量和命名空间信息。...编译具体流程 系统表拿到源码; 初始化命名空间ns_top、变量空间datums; 函数参数、返回值构造进入ns_top、datums; 调用yacc解析语法树,并构造语法块list; 所有信息拷贝到...datums;函数参数、返回值构造进入ns_top、datums;调用yacc解析语法树,并构造语法块list;所有信息拷贝到function结构体中;function记录到htab中;编译完成。

    1.2K20

    Postgresql源码(97)returns setof函数分析(oracle管道函数pipelined)

    Postgresql的return setof函数并不能起到降低内存使用的效果,return next 单条数据只起到了缓存的效果,并不会把数据逐条返回SQL层处理,没有降低内存的效果。...例如:嵌套表类型outrecset是函数f_trans的返回值,普通函数只能组装好嵌套表outrecset(全部缓存在内存),一次性返回。如果嵌套表内容较多,可能会占用较大的内存空间。...如果使用管道函数,可以通过pipe row(嵌套表中的一行)来代替return语句,函数把嵌套表逐行返回给上层处理,无需缓存,降低内存使用。...; select * from f1(42); j ---- 43 44 但在内核实现中,并不是逐条返回的,return next其实只起到了缓存数据的功能,总的数据集也是一次性返回SQL层的...2 return next实现 return next目前支持三类数据的返回,var、rec、rows return next也可以不加参数,返回值按out参数列表拼接 具体处理函数:exec_stmt_return_next

    97340

    HAWQ中的行列转置

    子查询的结果为: test=# select name,string_agg(subject||':'||score,',' order by subject) as tmp test-# from...建立如下的PLPGSQL函数: create or replace function fn_crosstab(refcursor) returns refcursor as $body$ declare...为了给每个name的tag按原始位置增加序号,需要建立以下函数,返回数组值及其对应的下标: create or replace function f_unnest_ord(anyarray, out val...要达到想要的结果,最重要的是如何从现有的行构造出新的数据行。下面用三种方法实现。 (1)最直接的方法——union         用SQL的并集操作符union是最容易想到的方法。...许多关系数据库都提供相应的方法,例如Oracle用connect by level、MySQL用数字辅助表、PostgreSQL用generate_serie函数等。

    1.7K50

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

    全文总结 编译 1、编译过程主要是pl_gram.y做语法匹配的过程plpgsql_yyparse,整体匹配后的结果会作为PLpgSQL_stmt_block结构记录在plpgsql_parse_result...2、PLpgSQL_stmt_block结构分别记录两个核心List:body和exception,两个链表会记录所有执行节点(普通语句串到body后,when…then后的串到exception后)...3、编译过程会记录符号表:单链表ns_top记录所有使用的符号。...执行 1、执行过程整体框架在exec_stmt_block函数中 2、如果有异常处理:PG_TRY --> exec_stmts(estate, block->body) --> PG_CATCH --...list数组 plpgsql_compile function = plpgsql_HashTableLookup(&hashkey) :已经编译过的函数信息记录进入hash表,构造key可以快速查询

    1.3K30

    Postgresql源码(84)语义分析——函数调用结构CallStmt的构造与函数多态的实现(pl参数)

    pl参数)》 《Postgresql源码(84)语义分析——函数调用结构CallStmt的构造与函数多态的实现(pl参数)》 本文涉及模块:语法分析 、语义分析、查询重写 函数调用时在语义分析阶段...【类型转换】 如果匹配上了多个,那么需要应该执行哪个函数?【多态】 PG对于上述问题都有了完善的处理逻辑,本篇尝试分析该过程的处理细节。...自己拼接List outargs记录输出参数 【2】CallStmt是如何使用的 (《Postgresql源码(79)plpgsql中多层调用时参数传递关键点分析(pl参数)》问题四:内层ExecuteCallStmt...在返回候选函数的参数类型数组时,会用映射关系找到正确的类型顺序记录到候选函数参数类型列表中。...(没有指向型时不走MatchNamedCall且argnumbers数组为空) 第二步:ParseFuncOrColumn返回func_get_detail 【找到严格匹配候选者】遍历FuncnameGetCandidates

    1.1K10

    Greenplum高级使用

    (查询分析是根据analyze的固执生成的,生成之后按照这个查询计划执行,执行过程中analyze是不会变的。所以如果估值和真是情况差别较大,就会影响查询计划的生成。)...rows: 根据统计信息估计SQL返回结果集的行数。 width: 返回结果集每一行的长度,这个长度值是根据pg_statistic表中的统计信息来计算的。...,ods.test_regular -- 参数:_date 当前日期 -- 返回值: 1 正确 其他为错误 -- 需要条件: 需要先执行***储存过程,在执行此过程 -- 版本:v1.0 -- 当前维护人...vs_function_return_value int;  -- 返回值      vs_num_rows numeric;   -- 记录行数      vs_logtype  varchar(5)...'; END $$ LANGUAGE plpgsql VOLATILE COST 100; 这个的返回值是text类型,使用EXECUTE也可以执行语句 9.4.2 使用函数 只需要使用正常的SQL查询即可

    1.5K10

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

    ExprContext就够了,但是ExprContext会依赖EState结构才能创建出来,所以PL在执行时,plpgsql_exec_function函数需要传入EState结构,方便后面ExprContext...在SQL层的执行器中运行时状态使用EState记录,在PL中状态信息使用PLpgSQL_execstate结构记录。...Datum retval; bool retisnull; Oid rettype; // 返回值处理 ......实际上呢,丢给SQL引擎执行时一般需要ExprContext就够了,但是ExprContext会依赖EState结构才能创建出来,所以PL在执行时,plpgsql_exec_function函数需要传入...因为PL中的异常处理会自动启动子事务,为了让表达式计算申请的资源能和子事务一块释放,需要将ExprContext与子事务关联起来: 一旦子事务释放,在回调函数plpgsql_subxact_cb

    69220
    领券