CREATE [OR REPLACE] PROCEDURE procedure_name (parameter_list) LANGUAGE plpgsql AS $$ DECLARE -- 声明变量 BEGIN -- 存储过程体 COMMIT; -- 或 ROLLBACK EXCEPTION WHEN exception_type THEN -- 异常处理逻辑 END; $$;
参数类型
存储过程支持三种参数类型:
IN(默认):输入参数,在存储过程中使用,不能被修改。
OUT:输出参数,在存储过程中被赋值,返回给调用者。
INOUT:输入输出参数,既可以作为输入值,也可以在存储过程中被修改并返回。
复合类型:type
复合类型例子如下
-- 定义复合类型 CREATE TYPE employee_info_type AS ( emp_name TEXT, emp_salary NUMERIC, emp_hire_date DATE );
-- 存储过程返回复合类型 CREATEOR REPLACE PROCEDURE get_employee_info( emp_id INTEGER, OUTresult employee_info_type ) LANGUAGE plpgsql AS $$ BEGIN SELECT name, salary, hire_date INTOresult FROM employees WHERE id = emp_id; IF NOT FOUND THEN RAISE EXCEPTION '员工 ID % 不存在', emp_id; END IF; END; $$;
例子
CREATEOR REPLACE PROCEDURE update_salary( emp_id INTEGER, -- 输入参数 new_salary INTEGER, -- 输入参数 OUT updated BOOLEAN, -- 输出:更新是否成功 OUT old_salary INTEGER, -- 输出:旧工资 OUT error_msg TEXT -- 输出:错误信息 ) LANGUAGE plpgsql AS $$ DECLARE v_count INTEGER; BEGIN -- 查询旧工资 SELECT salary INTO old_salary FROM employees WHERE id = emp_id; -- 更新工资 UPDATE employees SET salary = new_salary WHERE id = emp_id; GET DIAGNOSTICS v_count = ROW_COUNT; updated := v_count >0; IF NOT updated THEN error_msg :='员工ID不存在'; ELSE error_msg :=NULL; END IF; EXCEPTION WHEN OTHERS THEN updated :=FALSE; error_msg := SQLERRM; -- 捕获异常信息 END; $$;
调用
DO $$ DECLARE v_updated BOOLEAN; v_old_salary INTEGER; v_error_msg TEXT; BEGIN -- 调用存储过程,将输出参数赋值给变量 CALL update_salary( emp_id =>1001, new_salary =>8000, updated => v_updated, old_salary => v_old_salary, error_msg => v_error_msg ); -- 打印结果(实际应用中可根据需求处理结果) RAISE INFO '更新结果:%,旧工资:%,错误信息:%', v_updated, v_old_salary, v_error_msg; END $$;