前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Postgresql中有out参数的函数,无法配置out值怎么办?

Postgresql中有out参数的函数,无法配置out值怎么办?

作者头像
mingjie
发布2023-03-17 10:15:52
9390
发布2023-03-17 10:15:52
举报
文章被收录于专栏:Postgresql源码分析

问题描述

Postgresql中写C函数时,如果函数有out类型的参数,在C代码中 是 无法 为Out参数配置值的,因为return只能配置返回值无法配置out值,这是PG的框架问题,我们可以想办法规避。

例如下面的例子,如果在C语言中实现tp14函数,b、c的值都是无法配置的。

(这里是PL语言的例子,当然可以配置b、c的值,C函数办不到)

代码语言:javascript
复制
CREATE or replace function tp14(
  a in integer , 
  b out integer,
  c out integer)
return int
LANGUAGE plpgsql
AS $$
BEGIN

  b := 1;
  c := 2;

  return 100;
END;
$$;

select tp14(1,2,3);

解决方案

第一步:function改写成procedure,并把return值的类型加入到参数列表中,作为一个out类型的参数:

代码语言:javascript
复制
CREATE or replace procedure tp14_inner(
  a in integer , 
  b out integer,
  c out integer,
  rr out int)       -- 添加 rr 参数,通过out作为返回值
LANGUAGE plpgsql
AS $$
BEGIN
  b := 1;
  c := 2;
  rr := 100;        -- return 100 改写为 rr := 100;
END;
$$;

这样在C语言中,可以return一个record类型(record需要和参数列表中的out数量、类型对齐),record类型中有三列:分别是整形1、整形2、整形100,return就可以一次性把所有需要的都返回了。

第二步:创建外层函数,保持与原函数接口一致。

外层函数负责保持与原函数接口一直,外层函数调用内层函数,将rr的值从out参数拿出来,重新return 回去即可!

代码语言:javascript
复制
CREATE or replace function tp14_outter(
  a in integer , 
  b out integer,
  c out integer)
RETURNS int
LANGUAGE plpgsql
AS $$
DECLARE
  rr int;
  b int;
  c int;
BEGIN
  call tp14_inner(a, b, c, rr);
  return rr;
END;
$$;

select tp14_outter(1, 0, 0);

 tp14_outter 
-------------
         100
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档