sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
sudo -u postgres createdb mydb
sudo -u postgres createuser -P myuser # 按提示设置密码
使用PL/pgSQL创建存储过程
无参数存储过程(示例:插入数据)
CREATE OR REPLACE PROCEDURE insert_sample_data()
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO sample_table (name, value) VALUES ('Test', 100);
END;
$$;
调用:CALL insert_sample_data();
带输入参数的存储过程(示例:计算两数之和)
CREATE OR REPLACE FUNCTION add_numbers(a INTEGER, b INTEGER)
RETURNS INTEGER
LANGUAGE plpgsql
AS $$
BEGIN
RETURN a + b;
END;
$$;
调用:SELECT add_numbers(5, 3);
带输出参数的存储过程(示例:返回最大值)
CREATE OR REPLACE FUNCTION get_max_value()
RETURNS INTEGER
LANGUAGE plpgsql
AS $$
DECLARE
max_val INTEGER;
BEGIN
SELECT MAX(value) INTO max_val FROM sample_table;
RETURN max_val;
END;
$$;
调用:SELECT get_max_value();
控制流与异常处理
CREATE OR REPLACE PROCEDURE update_with_check(id INTEGER, new_name TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM sample_table WHERE id = id) THEN
RAISE EXCEPTION 'ID % not found', id;
END IF;
UPDATE sample_table SET name = new_name WHERE id = id;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Error: %', SQLERRM;
END;
$$;
调用:CALL update_with_check(1, 'NewName');
事务管理
CREATE OR REPLACE PROCEDURE transfer_funds(from_id INTEGER, to_id INTEGER, amount NUMERIC)
LANGUAGE plpgsql
AS $$
BEGIN
BEGIN
UPDATE accounts SET balance = balance - amount WHERE id = from_id;
UPDATE accounts SET balance = balance + amount WHERE id = to_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE NOTICE 'Transfer failed';
END;
$$;
动态SQL
CREATE OR REPLACE FUNCTION dynamic_query(table_name TEXT)
RETURNS SETOF RECORD
LANGUAGE plpgsql
AS $$
DECLARE
query TEXT;
BEGIN
query := 'SELECT * FROM ' || table_name;
RETURN QUERY EXECUTE query;
END;
$$;
调用:SELECT * FROM dynamic_query('users') AS (id INT, name TEXT);
CREATE权限,生产环境需谨慎操作。RAISE NOTICE输出调试信息。CREATE PROCEDURE语法,旧版本需用CREATE FUNCTION模拟。通过以上步骤,可在Debian环境中高效编写和管理PostgreSQL存储过程,实现业务逻辑的封装与复用。