PGSQL查看与停止任务,查找涉及到表的存储过程

本笔记仅供在PGSQL数据库下使用

查询当前活动的任务(此处的mdn指的是数据库名)
SELECT T
 .PID,
 T.STATE,
 T.QUERY,
 T.WAIT_EVENT_TYPE,
 T.WAIT_EVENT,
 T.QUERY_START    
FROM
 PG_STAT_ACTIVITY T 
WHERE
 T.DATNAME = 'mdn'  and state = 'active'

查询死锁的任务或表

SELECT T
 .PID,
 T.STATE,
 T.QUERY,
 T.WAIT_EVENT_TYPE,
 T.WAIT_EVENT,
 T.QUERY_START    
FROM
 PG_STAT_ACTIVITY T 
WHERE
 T.DATNAME = 'mdn'  and state = 'lock'

解锁(这里的6388是死锁的pid,即上面查询的结果之一)

select PG_CANCEL_BACKEND('6388');

查询哪些存储过程中含有某张表

select * from pg_proc where prosrc like '%表名%';

### PostgreSQL 存储过程的创建使用 #### 创建存储过程PostgreSQL 中,可以通过 `CREATE OR REPLACE PROCEDURE` 来定义存储过程。以下是其基本语法: ```sql CREATE OR REPLACE PROCEDURE procedure_name ( [IN | OUT | INOUT] parameter_name data_type, ... ) AS $$ BEGIN -- 存储过程逻辑 END; $$ LANGUAGE plpgsql; ``` 上述语法规则涵盖了存储过程的核心部分[^2]。其中: - **参数模式**:可以指定为 `IN`, `OUT`, 或 `INOUT`。 - `IN`: 输入参数,默认值。 - `OUT`: 输出参数,通常用于返回单个或多个结果。 - `INOUT`: 同时作为输入输出参数。 - **数据类型**:支持多种标准 SQL 数据类型。 #### 示例:带返回值的存储过程 下面是一个简单的例子,展示如何创建一个带有返回值的存储过程,并通过调用来获取结果。 ##### 创建存储过程 ```sql CREATE OR REPLACE PROCEDURE calculate_sum(IN num1 integer, IN num2 integer, OUT result integer) AS $$ BEGIN result := num1 + num2; END; $$ LANGUAGE plpgsql; ``` 此存储过程中,`num1` `num2` 是输入参数,而 `result` 则是输出参数,示两数之的结果[^3]。 ##### 调用存储过程 要执行该存储过程,可以使用以下命令: ```sql CALL calculate_sum(5, 7, result); SELECT result; ``` 这会将 `5` `7` 的赋给变量 `result` 并显示出来。 #### 示例:带条件逻辑的存储过程 另一个更复杂的场景涉及更新数据库中的某些字段。例如,基于员工 ID 修改薪资水平。 ##### 创建存储过程 ```sql CREATE OR REPLACE PROCEDURE update_salary( IN employee_id integer, IN percentage_increase numeric ) AS $$ DECLARE current_salary NUMERIC; BEGIN SELECT salary INTO current_salary FROM employees WHERE id = employee_id; IF NOT FOUND THEN RAISE EXCEPTION 'Employee with ID % not found', employee_id; ELSE UPDATE employees SET salary = current_salary * (1 + percentage_increase / 100) WHERE id = employee_id; END IF; END; $$ LANGUAGE plpgsql; ``` 在此示例中,如果未找到对应的员工记录,则抛出异常;否则按照百分比调整工资。 ##### 调用存储过程 ```sql CALL update_salary(101, 10); ``` 这条指令将会把编号为 `101` 的员工薪水增加 10%。 #### 动态SQL操作 对于一些动态需求(比如批量新增列),也可以利用存储过程完成复杂任务。如下所示的是一个函数实现的例子,它允许向任意一次性添加多列[^4]: ```sql CREATE OR REPLACE FUNCTION pg_addcolumn(_columns TEXT[], _table_name VARCHAR) RETURNS INT AS $BODY$ DECLARE col_count INTEGER; sql_stmt VARCHAR; BEGIN FOREACH col_text IN ARRAY _columns LOOP sql_stmt := format('ALTER TABLE %I ADD COLUMN %I VARCHAR DEFAULT NULL;', _table_name, col_text); EXECUTE sql_stmt; END LOOP; RETURN array_length(_columns, 1); END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ``` 调用方式如下: ```sql SELECT public.pg_addcolumn(array['col_a','col_b'], 'my_table'); ``` 以上展示了如何灵活运用存储过程解决实际问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值