pg11函数存储过程调用示例

pg11函数存储过程调用总结

测试数据:

create table test(id int,name varchar,age int);
insert into test values(1,'hh',30);

函数调用方式:

对于函数调用返回值为refcursor类型的调用方式,一行作为一个语句执行

begin;
select * from function(); --调用函数名
fetch  all  in "<游标编码号>";  --根据select * from function()查询结果得出游标编码号,再通过fetch显示结果集
end;

存储过程调用方式:

DO $$
DECLARE proc_param int := 5; --参数
BEGIN
  CALL proc_name(proc_param);--调用
END
$$;

一、函数

函数无OUT参数,返回值跟returns 类型保持一致;

如果函数带OUT参数返回,分两种情况:只有一个OUT参数,函数返回值类型与OUT参数保持一致;有多个OUT参数,返回值类型为RECORD类型;此时returns data_type可有可无,存在时,类型则与要求的保持一致。

函数定义:返回RECORD类型

create or replace function test_fun(v1 int, v2 out varchar,v3 out int) as $$  --默认返回值为record类型
declare 
p1 test;
p2 test[];
p3 refcursor;
v_name varchar;
v_age int;
begin
truncate table test;
insert into test values(1,'cs',40);
select name,age into v2,v3 from test where id = v1;
INSERT  INTO test (id,name,age)VALUES(2,'tom',12) RETURNING * INTO p1;
raise notice 'INSERT-RETURNING:%',p1;
INSERT  INTO test (id,name,age)VALUES(3,'hhdb',22) RETURNING name,age INTO v_name,v_age;
raise notice 'INSERT-RETURNING:%,%',v_name,v_age;
UPDATE test SET name = 'John'  WHERE id = 1 RETURNING * INTO p1;--超过一行会报错
raise notice 'UPDATE-RETURNING:%',p1;
DELETE FROM test WHERE id= 1 RETURNING * INTO p1;  --数组超过一行也会报错
raise notice 'DELETE-RETURNING:%',p1;
--DELETE FROM test WHERE id!= 1 RETURNING * INTO p2;  --数组超过一行也会报错
--DELETE FROM test WHERE id!= 1 RETURNING * INTO p3;  --数组超过一行也会报错
end
$$ language plpgsql;

函数调用

select   (test_fun(1)).v2;   --默认返回值为record类型
select   (test_fun(1)).v3;  --默认返回值为record类型
select v2,v3 from test_fun(1);  --默认返回值为record类型
select * from test_fun(1);   --默认返回值为record类型

函数定义:与OUT参数返回值类型一致:

create or replace function test_fun(v1 int, v2 out varchar) as $$     --默认返回值为varchar类型,返回值类型可写可不写
begin
select name,age into v2 from test where id = v1;
end
$$ language plpgsql;

函数调用:

select   (test_fun(1)).v2;  ---非法调用,函数默认返回为varchar类型
select v2 from test_fun(1);
select * from test_fun(1)

函数定义:与OUT参数返回值类型一致:

create or replace function test_fun(v1 int, v2 out refcursor) as $$    --默认返回值为refcursor类型,返回值类型可写可不写
begin
open v2 for select name,age from test where id = v1;
end
$$ language plpgsql;

函数调用:

begin 
select * from test_fun(1);
fetch  all  in "<unnamed portal 2>";
end

函数定义:返回值类型为RECORD,里面包括游标复杂类型

create or replace function test_fun(v1 int,v2 out varchar, v3 out refcursor) as $$  --默认返回值为record类型,返回值类型可写可不写
begin
--open v3 for select name into v2   from test where id = v1; --此情况创建正常,调用出错,转成以下两个语句,同时into 多个变量PG不支持,oracle虽然支持,但是运行结果显示并没有将值INTO到指定的变量中
open v3 for select *  from test where id = v1;
select name into v2  from test where id = v1;
end
$$ language plpgsql;

函数调用:

begin;
select * from test_fun(1);
fetch  all  in "<unnamed portal 4>";
end;

二、存储过程

存储过程定义:

CREATE PROCEDURE triple(INOUT x int)
LANGUAGE plpgsql
AS $$
BEGIN
    x := x * 3;
END;
$$;

存储过程调用:

DO $$
DECLARE myvar int := 5;
BEGIN
  CALL triple(myvar);
  RAISE NOTICE 'myvar = %', myvar;  -- prints 15
END
$$;
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值