欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > openGauss 5.0函数(Function)和过程(Procedure)

openGauss 5.0函数(Function)和过程(Procedure)

2025/12/10 22:39:22 来源:https://blog.csdn.net/zxrhhm/article/details/141629316  浏览:    关键词:openGauss 5.0函数(Function)和过程(Procedure)

在 openGauss 5.0(或者更广泛地,在数据库系统中),函数(Function)和过程(Procedure)是两种执行特定任务的数据库对象,但它们之间存在一些关键差异。理解这些差异有助于你在数据库设计和实现中做出适当的选择。

函数(Function)

函数在数据库中用于执行特定计算或操作,并返回一个值。它可以被看作是一个封装的 SQL 语句集合,接受输入参数(可选),执行操作,并返回一个结果。在 openGauss(和大多数 SQL 数据库系统)中,函数可以用于表达式中,这意味着你可以在一个 SQL 查询中直接调用函数,并将函数返回的结果用于进一步的计算或数据检索。

示例1
CREATE OR REPLACE FUNCTION get_salary_increase(salary NUMERIC)  
RETURNS NUMERIC AS $$  
BEGIN  RETURN salary * 1.1; -- 假设增加10%  
END;  
$$ LANGUAGE plpgsql;  -- 使用函数  
SELECT get_salary_increase(1600) AS new_salary  ;superdb=> SELECT get_salary_increase(1600) AS new_salary  ;new_salary
------------1760.0
(1 row)
示例2
CREATE FUNCTION fn_get_bal(acc_no IN NUMBER) RETURN NUMBER IS acc_bal NUMBER(11,2);BEGIN SELECT count(*) INTO acc_bal FROM public.t_opengauss ;RETURN(acc_bal); END;
/select fn_get_bal(165);superdb=> select fn_get_bal(165);fn_get_bal
------------5.00
(1 row)

过程(Procedure)

过程在数据库中执行一系列操作,但它不直接返回结果(至少不是像函数那样返回单个值)。过程可以接受输入参数和输出参数(输出参数通过其他方式访问,比如 OUT 参数或在会话状态中的更改)。过程主要用于执行需要复杂逻辑的任务,如插入、更新或删除多行数据,或者在多个步骤中更改数据库状态。

示例1
CREATE OR REPLACE PROCEDURE sp_update_employee_salary(p_id INT, p_increase NUMERIC)
AS $$
BEGINUPDATE employeesSET salary = salary + p_increaseWHERE id = p_id;
END;
$$ LANGUAGE plpgsql;-- 调用过程
CALL sp_update_employee_salary(1, 1000);
示例2
CREATE OR REPLACE PROCEDURE sp_proc_case_branch(pi_result in integer, pi_return out integer)
AS BEGIN -- 根据pi_result的值设置pi_returnCASE pi_result WHEN 1 THEN  pi_return := 111; WHEN 2 THEN  pi_return := 222; WHEN 3 THEN  pi_return := 333; WHEN 6 THEN  pi_return := 666; WHEN 7 THEN  pi_return := 777; WHEN 8 THEN  pi_return := 888; WHEN 9 THEN  pi_return := 999; WHEN 10 THEN pi_return := 100; ELSE   pi_return := 110; END CASE; -- 输出pi_return的值,用于调试或日志记录raise info 'pi_return : %',pi_return ; 
END; 
/CALL sp_proc_case_branch(3,0);superdb=> CALL sp_proc_case_branch(3,0);
INFO:  pi_return : 333pi_return
-----------333
(1 row)--删除存储过程
DROP PROCEDURE proc_case_branch;
示例3
create or replace procedure sp_proc_get_msg(inout p1 text)
as 
beginraise info 'raise info procedure parameter:%',p1;raise notice 'raise noticeprocedure parameter:%',p1;
end;-- 调用存储过程
call sp_proc_get_msg(p1=>'sgc-dba-supermao');superdb=> call sp_proc_get_msg(p1=>'sgc-dba-supermao');
INFO:  raise info procedure parameter:sgc-dba-supermao
NOTICE:  raise noticeprocedure parameter:sgc-dba-supermaop1
------------------sgc-dba-supermao
(1 row)

函数与过程的比较

  • 返回值:函数返回一个值,而过程不直接返回任何值(虽然可以通过 OUT 参数或影响数据库状态来“返回”结果)。
  • 用途:函数更适合用在需要计算结果并将其用在查询中的场景;过程则更适用于执行一系列复杂操作,这些操作可能需要多个步骤和复杂的逻辑。
  • 调用方式:函数可以作为表达式的一部分被调用,而过程则通过 CALL 语句单独调用。

在选择使用函数还是过程时,应该根据具体的需求和场景来决定。如果你的任务是计算并返回一个值,那么函数是更好的选择;如果你的任务是执行一系列操作而不需要直接返回单个值,那么过程可能更合适。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词