PostgreSQL函数返回OUT参数

原创
2020/08/10 21:48
阅读数 3.3K

本篇学习一下如何用C函数返回出(OUT/INOUT)参。前边讲过在函数中返回结果集,如果只返回一个或多个OUT/INOUT参数该如何编码?

 

1、系统表 pg_proc 的字段含义

prorettype :返回值类型
proretset:返回值是否为集合
proargmodes:参数模式(IN、OUT、INOUT)

 

2、查找现成的示例

一般我们都能在PG的现有代码中找到使用方法:

SELECT proname,proargmodes,prorettype::regtype,array_position(proargmodes, 'o') FROM pg_proc
  WHERE NOT proretset AND proargmodes IS NOT NULL
    AND (array_position(proargmodes, 'o') IS NOT NULL
      OR array_position(proargmodes, 'b') IS NOT NULL)
  LIMIT 10;

返回包含OUT和INOUT参数的函数定义,'b' 为 INOUT参数。注意上边 ::regtype 的用法,增强结果的可读性:

pg_stat_get_archiver               | {o,o,o,o,o,o,o} | record | 1
pg_event_trigger_table_rewrite_oid | {o}             | oid    | 1

更多结果略。

 

3、多个OUT参数的返回

打开函数 pg_stat_get_archiver

// 自己定义TupleDesc,数量不包含IN入参
// 与前边讲过的返回结果集构建方法相同
tupdesc = CreateTemplateTupleDesc(7);
// 不一样的地方
BlessTupleDesc(tupdesc);

/* 构建 values 和 nulls 数组 */

// 返回结果
PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls)));

结果集函数在 TupleDescGetAttInMetadata 中调用 BlessTupleDesc

 

4、返回单个出参

直接调用 PG_RETURN_xxx 系列返回即可,pg_event_trigger_table_rewrite_oid 函数中:

PG_RETURN_OID(currentEventTriggerState->table_rewrite_oid);

 

5、INOUT参数

官方代码没有例子,猜测可以这样:输入值用 PG_GETARG_xx 取得,输出与OUT相同,有兴趣可以写个代码自己试试。

 

本文很水,主要是分享一下怎样从现有代码中找到自己需要的东西。

 

欢迎关注

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部