pg11函数存储过程调用示例

本文深入探讨了PG11中函数和存储过程的使用技巧,包括函数的多种返回类型、调用方式,以及存储过程的定义与调用流程。通过具体示例,详细解析了函数如何处理OUT参数、返回游标和RECORD类型,同时展示了存储过程的参数传递与执行细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
$$;
### 在 PostgreSQL 中通过 SQL 调用函数的方法 在 PostgreSQL 中,可以通过 `SELECT` 语句直接调用函数函数可以返回单个值、多个值或表。以下详细说明如何使用 SQL 调用函数,并提供相关示例。 #### 调用返回单个值的函数 如果函数返回单个值,则可以在 `SELECT` 语句中直接调用函数。例如,假设有一个名为 `add_numbers(a integer, b integer)` 的函数[^1],它可以接受两个整数并返回它们的和: ```sql SELECT add_numbers(5, 3); ``` 上述语句将返回结果 `8`。 #### 调用返回多个值的函数 某些函数可能返回多个值,通常以数组或记录的形式返回。例如,假设有一个函数 `get_user_info(id integer)`,它返回用户的姓名和年龄作为记录[^4]: ```sql SELECT * FROM get_user_info(1); ``` 如果函数返回多个列,可以明确指定需要的列名: ```sql SELECT (get_user_info(1)).name, (get_user_info(1)).age; ``` #### 调用返回表的函数函数返回表时,可以将其用于从表中检索数据。例如,假设有一个函数 `get_active_users()` 返回一个包含所有活跃用户的表[^4]: ```sql SELECT * FROM get_active_users(); ``` 这将返回由 `get_active_users()` 函数生成的结果集。 #### 使用条件逻辑调用函数 如果需要在调用函数时应用条件逻辑,可以结合 `CASE` 或 `IF` 语句。例如,根据输入参数选择不同的函数调用: ```sql SELECT CASE WHEN input_value > 0 THEN positive_function(input_value) ELSE negative_function(input_value) END; ``` #### 示例调用存储过程函数PostgreSQL 中的存储过程通常以函数形式实现。以下是一个示例,展示如何创建并调用一个简单的函数: ```sql -- 创建函数 CREATE OR REPLACE FUNCTION greet(name text) RETURNS text AS $$ BEGIN RETURN 'Hello, ' || name; END; $$ LANGUAGE plpgsql; -- 调用函数 SELECT greet('World'); ``` 上述代码将返回字符串 `Hello, World`。 #### 注意事项 - 确保调用函数已正确创建并可用。 - 如果函数涉及复杂逻辑或大量数据处理,应评估其性能影响。 - 在调用返回表的函数时,确保查询中的列与函数返回的列匹配。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值