Postgres SQL存储函数参数使用说明

在使用postgres数据库的过程中,遇到了表分区的问题。为了创建表分区,首先得创建分区表。首先想到的是写个存储函数,然后定时的创建分区表,然后再创建触发器去操作分区表。但是在创建存储函数时,怎么把分区表的表名当作参数传进存储函数,然后在函数内部动态创建表。可是直接使用字符串的表名不起作用。经研究,需要使用EXECUTE去执行,具体做法为:拼接一个创建表的sql语句,然后用EXECUTE 执行sql语句,这样创建表就完成了。详细代码如下:

CREATE OR REPLACE FUNCTION "public"."pro_partition_play_recond"(tablename varchar)
  RETURNS "pg_catalog"."void" AS $BODY$Declare  
    sqlstring varchar(1024); 
		start_date varchar DEFAULT '2017-08-01';
		end_date varchar DEFAULT '2017-09-01';
		index_str varchar ;
BEGIN
		sqlstring:= 'create table '|| tablename ||'(check(create_date >= ''' || start_date || '''  AND create_date < ''' || end_date || ''')) INHERITS (md_play_recode);';
    EXECUTE sqlstring;
		index_str=tablename || '_create_date';
		raise notice 'Parameter  is: %', index_str ;	
		sqlstring:='create index '||index_str||' on '|| tablename ||' (create_date);';
		EXECUTE sqlstring;
	 
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;

ALTER FUNCTION "public"."pro_partition_play_recond"(tablename varchar) OWNER TO "postgres";

说明:表名参数tablename 在拼接sql语句时,应用用:'|| tablename ||',需要加引号时用这个''' || start_date || '''。这是3个单引号。
调用如下:

select pro_partition_play_recond('md_play_recode_201708');

效果如下:




代码如下:

CREATE OR REPLACE FUNCTION "public"."pro_partition_play_recond"(tablename varchar)
  RETURNS "pg_catalog"."void" AS $BODY$Declare  
    sqlstring varchar(1024); 
		start_date varchar DEFAULT '2017-08-01';
		end_date varchar DEFAULT '2017-09-01';
		index_str varchar ;
BEGIN
		sqlstring:= 'create table '|| tablename ||'(check(create_date >= ''' || start_date || '''   AND create_date < ''' || end_date || ''')) INHERITS (md_play_recode);';
    EXECUTE sqlstring;
		index_str=tablename || '_create_date';
		raise notice 'Parameter  is: %', index_str ;	
		sqlstring:='create index '||index_str||' on '|| tablename ||' (create_date);';
		EXECUTE sqlstring;
	 
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值