[PG] postgresql 存储过程示例

本文介绍PostgreSQL函数的创建与使用,包括数据检测与标记、批量添加列及清理过期数据的具体实现,展示如何利用PL/pgSQL语言增强数据库操作。

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

PostgreSQL函数也称为PostgreSQL存储过程。 PostgreSQL函数或存储过程是存储在数据库服务器上并可以使用SQL界面调用的一组SQL和过程语句(声明,分配,循环,控制流程等)。 它有助于您执行通常在数据库中的单个函数中进行多次查询和往返操作的操作。

您可以在许多语言(如SQL,PL/pgSQL,C,Python等)中创建PostgreSQL函数

CREATE [OR REPLACE] FUNCTION function_name (arguments)   
RETURNS return_datatype AS $variable_name$  
  DECLARE  
    declaration;  
    [...]  
  BEGIN  
    < function_body >  
    [...]  
    RETURN { variable_name | value }  
  END; LANGUAGE plpgsql;

参数说明

  • function_name:指定函数的名称。
  • [OR REPLACE]:是可选的,它允许您修改/替换现有函数。
  • RETURN:它指定要从函数返回的数据类型。它可以是基础,复合或域类型,或者也可以引用表列的类型。
  • function_bodyfunction_body包含可执行部分。
  • plpgsql:它指定实现该函数的语言的名称。

简单示例

1. 对数据进行检测并打标记

CREATE OR REPLACE FUNCTION "public"."pg_materules"(varchar)
  RETURNS "pg_catalog"."int4" AS $BODY$
  Declare
   tableName VARCHAR;
   sql VARCHAR;
   res int;
   Begin
			tableName:=$1;	
			res:=0;
			---- 初始化表内容
			sql = 'update '||tableName||' set err_message=''异常信息:'';';execute sql;
			---- 
			----数据表字段检查
			sql:= 'select count(*) from information_schema.columns WHERE table_name = '''||tableName||''' and column_name = ''id'';';
			execute sql into res;
			if res is null or res=0 then
				sql = 'update '||tableName||' set err_message=err_message||''ID字段缺失,'';';execute sql;
			end if;
				sql:= 'select count(*) from information_schema.columns WHERE table_name = '''||tableName||''' and column_name = ''name'';';
			execute sql into res;
			if res is null or res=0 then
				sql = 'update '||tableName||' set err_message=err_message||''NAME字段缺失,'';';execute sql;
			end if;
				sql:= 'select count(*) from information_schema.columns WHERE table_name = '''||tableName||''' and column_name = ''citycode'';';
			execute sql into res;
			if res is null or res=0 then
				sql = 'update '||tableName||' set err_message=err_message||''CITYCODE字段缺失,'';';execute sql;
			end if;
			----
			---- 坐标检查
			----
			sql:= 'select count(*) from information_schema.columns WHERE table_name = '''||tableName||''' and column_name = ''lat'';';
			execute sql into res;
			if res is null or res=0 then
				sql = 'update '||tableName||' set err_message=err_message||''LAT字段缺失,'';';execute sql;
			else
				----初始化坐标类型
				sql = 'ALTER TABLE '||tableName||' ALTER COLUMN lat TYPE varchar(100);';execute sql;
				sql:= 'update '||tableName||' set err_message=err_message||''缺失坐标LAT,'' where lat='''' or lat is null;';execute sql;
			end if;
			
			sql:= 'select count(*) from information_schema.columns WHERE table_name = '''||tableName||''' and column_name = ''lon'';';
			execute sql into res;
			if res is null or res=0 then
				sql = 'update '||tableName||' set err_message=err_message||''LON字段缺失,'';';execute sql;
			else
				----初始化坐标类型
				sql = 'ALTER TABLE '||tableName||' ALTER COLUMN lon TYPE varchar(80);';execute sql;
				sql:= 'update '||tableName||' set err_message=err_message||''缺失坐标LON,'' where lon='''' or lon is null;';execute sql;
			end if;
			----
			---- 销售额字段检查处理
			----
			sql:= 'select count(*) from information_schema.columns WHERE table_name = '''||tableName||''' and column_name = ''sale'';';
			execute sql into res;
			if res is null or res=0 then
				sql = 'update '||tableName||' set type_message=''空白门店'';';execute sql;
			else
				----初始化销售额类型
				sql = 'ALTER TABLE '||tableName||' ALTER COLUMN sale TYPE INT;';execute sql;
				sql = 'update '||tableName||' set type_message=''覆盖门店'' where type_message='''' or type_message is null;';execute sql;
				sql:= 'update '||tableName||' set err_message=err_message||''销售额异常,'' where sale is null or sale <=0;';execute sql;
			end if;
			----
			---- 业态检查
			----
			sql:= 'select count(*) from information_schema.columns WHERE table_name = '''||tableName||''' and column_name = ''yt'';';
			execute sql into res;
			if res is null or res=0 then
					sql = 'update '||tableName||' set err_message=err_message||''YT字段缺失,'';';execute sql;
			else
				sql:= 'update '||tableName||' set err_message=err_message||''缺失业态,'' where yt = '''' or yt is null;';execute sql;
			end if;
    return 0;
   end;
 $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

2. 给某张表添加多个列

CREATE OR REPLACE FUNCTION "public"."pg_addcolumn"(_text, varchar)
  RETURNS "pg_catalog"."int4" AS $BODY$
  Declare
		cols text[];
		newTableName VARCHAR;
		scount INTEGER;
		sql VARCHAR;
   Begin
		cols:=$1;
		newTableName:=$2;
		scount:= array_length(cols,1);
    for i in 1..scount loop
			sql:='alter table '||newTableName||' add column '||quote_ident(cols[i])||' VARCHAR default null;';
			EXECUTE sql;
    end LOOP;
    return 0;
   end;
 $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

3.删除三个月以前的数据

CREATE OR REPLACE FUNCTION delete_ebd_compute_log_three_month_ago_data()
  RETURNS void AS
$BODY$
    begin
    delete from ebd_compute_log where create_time < CURRENT_TIMESTAMP(0) ::                 TIMESTAMP WITHOUT TIME ZONE - interval '3 months';
    END;
$BODY$
LANGUAGE plpgsql VOLATILE;

GRANT EXECUTE ON FUNCTION delete_ebd_compute_log_three_month_ago_data() TO public;


 

### 如何在 PostgreSQL 存储过程中实现日志打印功能 在 PostgreSQL 中,`RAISE` 语句用于生成消息并将其发送到客户端或服务器日志中。其中 `RAISE NOTICE` 是一种常见的用法,适用于调试和记录存储过程中的状态信息[^1]。 以下是使用 `RAISE NOTICE` 打印日志的一个简单示例: ```sql DO $$ BEGIN -- 使用 RAISE NOTICE 输出一条通知消息 RAISE NOTICE 'This is a log message: %', 'Variable Value'; END $$; ``` 在这个例子中,`RAISE NOTICE` 将输出指定的消息至日志文件或客户端终端。占位符 `%` 可以用来动态替换变量值[^2]。 如果需要在一个函数中多次打印日志,可以嵌套多个 `RAISE NOTICE` 语句。例如: ```sql CREATE OR REPLACE FUNCTION log_example() RETURNS void AS $$ DECLARE value integer := 42; BEGIN -- 记录初始值 RAISE NOTICE 'Initial value: %', value; -- 修改变量值 value := value * 2; -- 再次记录修改后的值 RAISE NOTICE 'Updated value: %', value; END; $$ LANGUAGE plpgsql; ``` 执行该函数后,日志会显示两次不同的变量值变化情况[^3]。 对于某些场景,当不需要返回查询结果而仅需触发操作时,可结合 `PERFORM` 和 `RAISE NOTICE` 来完成任务。例如: ```sql CREATE OR REPLACE FUNCTION perform_and_log() RETURNS void AS $$ BEGIN PERFORM current_date; -- 不返回任何数据 RAISE NOTICE 'Current date has been performed: %', CURRENT_DATE; END; $$ LANGUAGE plpgsql; ``` 此代码片段展示了如何利用 `PERFORM` 调用不带返回值的操作,并通过 `RAISE NOTICE` 向外部提供反馈信息[^3]。 #### 注意事项 - 日志级别除了 `NOTICE` 外还有其他选项如 `INFO`, `DEBUG` 等,可根据需求调整。 - 客户端工具(如 pgAdmin 或 psql)配置决定了是否能够看到这些日志输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值